16

如何连接 3 个NSData变量?

NSData *iv;
NSData *salt;
NSData *encryptedData;

我需要将这些加入到单个变量中。任何人都可以告诉我一个方法。

4

4 回答 4

33

使用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"
于 2012-09-14T12:35:18.243 回答
4

对于那些为 iOS5 及更高版本编写代码的人。我想展示一些真正好的串联。为什么这些答案还不够好?因为它们涉及复制数据的额外内存使用。让我们看看答案:

NSMutableData *concatenatedData = [NSMutableData data];
[concatenatedData appendData:iv];
[concatenatedData appendData:salt];
[concatenatedData appendData:encryptedData];

在这里,我们为 分配了内存ivsalt而且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); 

不要忘记 helper-converter

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;
}
于 2014-05-02T20:46:25.223 回答
0

您可以使用NSMutableData'-appendData方法:

NSMutableData *result = [NSMutableData data];

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

// result now has what you need.

这是使用可变数据的开销,这可能会更慢并使用更多内存,因此请谨慎使用。一般来说,您不希望 largeNSData的浮动。

于 2012-09-14T12:35:02.453 回答
-3

先创建两个NSObjects,使用这个方法

-(void)appendData:(NSData *)otherData  

并在NSData稍后与 3rdNSData一起使用相同的方法连接。

于 2012-09-14T12:42:41.250 回答