我使用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]);
答案 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
产生的数据(作为图片添加,因为它包含很多“非法”字符,我无法不要复制和粘贴:
正如您所看到的,它包含许多您并不真正需要的无用数据(突出显示为蓝色),这基本上只是为了给NSKeyedUnarchiver
足够的信息以便以后能够取消归档。
现在,让我们看一下JSON数据:
{"Value3":"12","Value2":"10","Value1":"sadsadasdasdsadqwwqsadasd"}
就是这样。一条线。 66个字节。其中,19个字节不是您的值。换句话说,JSON数据的 71%是您的值,其余的是标记,可以这么说。同时,在NSKeyedArchiver
数据中,您的值会组成,等待结果, 12%。我想你可以清楚地看到哪一个在这里存储效率更高。