![](/img/trans.png)
[英]How to convert ABRecordRef to NSData and NSData to ABRecordRef?
[英]How to concatenate 3 NSData variables
如何連接3個NSData
變量?
NSData *iv;
NSData *salt;
NSData *encryptedData;
我需要將這些加入一個變量。 任何人都可以告訴我一個方法。
使用NSMutableData
對象和方法-(void)appendData:(NSData *)otherData
編輯添加示例:
NSMutableData *concatenatedData = [NSMutableData data];
[concatenatedData appendData:iv];
[concatenatedData appendData:salt];
[concatenatedData appendData:encryptedData];
// and now you have all of the data in the single variable "concatenatedData"
適用於編寫iOS5及更高版本的用戶。 我想展示一些真正好的連接。 為什么這些答案不夠好? 因為它們涉及復制數據的額外內存使用。 讓我們看看答案:
NSMutableData *concatenatedData = [NSMutableData data];
[concatenatedData appendData:iv];
[concatenatedData appendData:salt];
[concatenatedData appendData:encryptedData];
這里我們為iv
, salt
和encryptedData
分配了內存,每次我們將其中一個附加到我們的可變連接中時,我們顯然會再次將其復制到可變數據中。 在處理大數據時,我們是否需要這些額外費用? 我不是。
有一種方法可以避免這種不必要的內存消耗 - dispatch_data
我不打算解釋它是如何工作的,你可以根據需要谷歌。 我只是給你一個有效的代碼:
NSData *iv = [@"some data" dataUsingEncoding:NSUTF8StringEncoding];
NSData *salt = [@"even more data" dataUsingEncoding:NSUTF8StringEncoding];
NSData *encryptedData = [@"and one more" dataUsingEncoding:NSUTF8StringEncoding];
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_data_t dispatch_data_iv = dispatch_data_create([iv bytes], [iv length], queue, DISPATCH_DATA_DESTRUCTOR_DEFAULT);
dispatch_data_t dispatch_data_salt = dispatch_data_create([salt bytes], [salt length], queue, DISPATCH_DATA_DESTRUCTOR_DEFAULT);
dispatch_data_t dispatch_data_encrypted = dispatch_data_create([encryptedData bytes], [encryptedData length], queue, DISPATCH_DATA_DESTRUCTOR_DEFAULT);
iv = nil; salt = nil; encryptedData = nil; // free all parts, we dont need it anymore
dispatch_data_t dispatch_data_concat = dispatch_data_create_concat( dispatch_data_create_concat(dispatch_data_iv, dispatch_data_salt), dispatch_data_encrypted);
NSData *concatenatedNSData = DataFromDispatchData(dispatch_data_concat);
// lets check now if the concatenation works properly
NSString *stringFromConcatenatedNSData = [[NSString alloc]initWithData:concatenatedNSData encoding:NSUTF8StringEncoding];
NSLog(@"%@",stringFromConcatenatedNSData);
不要忘記輔助轉換器
NSData *DataFromDispatchData(dispatch_data_t data)
{
NSMutableData *result = [NSMutableData dataWithCapacity: dispatch_data_get_size(data)];
dispatch_data_apply(data, ^(dispatch_data_t region, size_t offset, const void *buffer, size_t size) {
[result appendBytes:buffer length:size];
return (_Bool)true;
});
return result;
}
您可以使用NSMutableData
的-appendData
方法:
NSMutableData *result = [NSMutableData data];
[result appendData:iv];
[result appendData:salt];
[result appendData:encryptedData];
// result now has what you need.
這是在使用可變數據的開銷,這可能會更慢並使用更多內存,因此請小心使用。 一般來說,你不希望大型NSData
浮動。
首先創建兩個NSObjects
並使用此方法
-(void)appendData:(NSData *)otherData
然后在第三個NSData
放入一個NSData
也用同一個方法連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.