1

我正在使用BTLE将数据写入外围设备的特性之一。我想发送一个NSDictionary到那个特性。由于通过 BTLE 发送的数据限制为 130 字节,因此我想要一种有效的压缩方式,然后NSDictionaryNSData发送。我正在使用以下超出限制的代码。有任何想法吗?

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

1 回答 1

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 数据

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

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

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

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

于 2013-07-14T06:11:07.167 回答