2012-09-14 31 views

回答

31

使用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" 
+0

如何從NSMutableData獲取特定數據。 –

+0

@VineeshTP concatenatedData是可變數據。 – quantumpotato

0

你可以使用NSMutableData-appendData方法:

NSMutableData *result = [NSMutableData data]; 

[result appendData:iv]; 
[result appendData:salt]; 
[result appendData:encryptedData]; 

// result now has what you need. 

這都在使用可變數據,這可能會比較慢&使用更多的內存的開銷,因此要謹慎使用。一般來說,你不希望大的NSData浮動。

-3

首先創建兩個NSObjects和使用此方法

-(void)appendData:(NSData *)otherData 

並放入一個NSData後面第三個NSData也與相同的方法連接。

+0

感謝您的幫助。但是,對於iPhone而言,我並不陌生。請給我加入這三個NSData的代碼。預先感謝 –

4

適用於編碼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; 
} 
+2

我感受到了成熟的優化。如果其他代碼足夠好但仍具有較好的可讀性,則應該首選。 – vikingosegundo

+0

這是連接3個變量的很多代碼。 – quantumpotato

+0

@quantumpotato取決於變量使用多少內存 –