将NSDictionary压缩为NSData的有效方法

时间:2013-07-14 01:36:00

标签: ios objective-c cocoa-touch nsdictionary nsdata

我使用BTLE将数据写入外设的一个特性。我想将NSDictionary发送到这些特征中。由于通过BTLE发送130字节数据的限制,我想要一种有效的方法将NSDictionary压缩为NSData然后发送。我使用的是超出限制的下面一段代码。有什么想法吗?

NSDictionary *aDict = @{ @"Value1": @"sadsadasdasdsadqwwqsadasd",
                         @"Value2": @"10",
                         @"Value3": @"12" };
NSData *aData = [NSKeyedArchiver archivedDataWithRootObject:aDict];
NSLog(@"Data Size = %@",
        [NSByteCountFormatter stringFromByteCount:aData.length
                                       countStyle:NSByteCountFormatterCountStyleFile]);

1 个答案:

答案 0 :(得分:6)

我认为尝试使用任何形式的压缩都不会有效,甚至在这种规模上都可以完全改进,因为所有压缩算法在拥有大量数据时效果最好使用,因此找到许多重复和模式。当您的整个数据大小为130字节时,任何形式的zip压缩都不是真正可行的选择。


如果您的字典只包含属性列表值(数组,字典,字符串,数字),那么您可以使用JSON序列化而不是NSKeyedArchiver

NSData *JSONData = [NSJSONSerialization dataWithJSONObject:anObject
                                                   options:0
                                                     error:nil];

在您的情况下,这会立即使输出数据更短:

NSDictionary *aDict = @{ @"Value1": @"sadsadasdasdsadqwwqsadasd",
                         @"Value2": @"10",
                         @"Value3": @"12" };

NSData *aData = [NSKeyedArchiver archivedDataWithRootObject:aDict];
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:aDict
                                                   options:0
                                                     error:nil];

NSLog(@"NSKeyedArchiver Data Size = %@, JSON Data Size = %@",
      [NSByteCountFormatter stringFromByteCount:aData.length
                                     countStyle:NSByteCountFormatterCountStyleFile],
      [NSByteCountFormatter stringFromByteCount:jsonData.length
                                     countStyle:NSByteCountFormatterCountStyleFile]
      );
  

NSKeyedArchiver数据大小= 380字节,JSON数据大小= 66字节

如您所见,JSON序列化数据NSKeyedArchiver序列化数据小<6> ,并且很容易适合您的130字节限制。最棒的是,它只有一行代码。

更新:只是为了更多地擦一下:),这里是NSKeyedArchiver产生的数据(作为图片添加,因为它包含很多“非法”字符,我无法不要复制和粘贴:

NSKeyedArchiver Data

正如您所看到的,它包含许多您并不真正需要的无用数据(突出显示为蓝色),这基本上只是为了给NSKeyedUnarchiver足够的信息以便以后能够取消归档。

现在,让我们看一下JSON数据:

  

{"Value3":"12","Value2":"10","Value1":"sadsadasdasdsadqwwqsadasd"}

就是这样。一条线。 66个字节。其中,19个字节不是您的值。换句话说,JSON数据的 71%是您的值,其余的是标记,可以这么说。同时,在NSKeyedArchiver数据中,您的值会组成,等待结果, 12%。我想你可以清楚地看到哪一个在这里存储效率更高。