【问题标题】:How to concatenate 3 NSData variables如何连接 3 个 NSData 变量
【发布时间】:2012-09-14 12:31:13
【问题描述】:

如何连接3个NSData变量?

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

我需要将这些加入一个变量。谁能告诉我一个方法。

【问题讨论】:

    标签: iphone ios ios5 ios4


    【解决方案1】:

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

    【讨论】:

    • 如何从 NSMutableData 中检索特定数据。
    • @VineeshTPthe concatenatedData 是可变数据。
    【解决方案2】:

    对于那些为 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;
    }
    

    【讨论】:

    • 我闻到过早的优化。如果其他代码足够好但可读性更好,则应该首选它们。
    • 连接 3 个变量的代码很多。
    • @quantumpotato 取决于变量使用多少内存
    【解决方案3】:

    你可以使用NSMutableData-appendData方法:

    NSMutableData *result = [NSMutableData data];
    
    [result appendData:iv];
    [result appendData:salt];
    [result appendData:encryptedData];
    
    // result now has what you need.
    

    这是使用可变数据的开销,它可能会变慢并使用更多内存,因此请谨慎使用。一般来说,你不希望大的NSData 到处飘荡。

    【讨论】:

      【解决方案4】:

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

      -(void)appendData:(NSData *)otherData  
      

      稍后放入一个NSData 与第三个NSData 也使用相同的方法连接。

      【讨论】:

      • 感谢您的帮助。但是我是 iphone 新手,有点困惑。你能给我加入这三个 NSData 的代码吗。提前谢谢
      猜你喜欢
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      • 2018-02-27
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多