簡體   English   中英

如何連接3個NSData變量

[英]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];

這里我們為ivsaltencryptedData分配了內存,每次我們將其中一個附加到我們的可變連接中時,我們顯然會再次將其復制到可變數據中。 在處理大數據時,我們是否需要這些額外費用? 我不是。

有一種方法可以避免這種不必要的內存消耗 - 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM