Abh*_*nav 1 cocoa-touch objective-c nsdictionary nsdata ios
我使用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]);
Run Code Online (Sandbox Code Playgroud)
我不认为尝试使用任何形式的压缩都是有效的,甚至在这种规模上都没有改进,因为所有压缩算法在有大量数据可用时效果最好,因此有许多重复和模式到找.当您的整个数据大小为130字节时,任何形式的zip压缩都不是真正可行的选择.
如果您的字典只包含属性列表值(数组,字典,字符串,数字),那么您可以使用JSON序列化而不是NSKeyedArchiver:
NSData *JSONData = [NSJSONSerialization dataWithJSONObject:anObject
options:0
error:nil];
Run Code Online (Sandbox Code Playgroud)
在您的情况下,这会立即使输出数据更短:
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]
);
Run Code Online (Sandbox Code Playgroud)
NSKeyedArchiver数据大小= 380字节,JSON数据大小= 66字节
如您所见,JSON序列化数据几乎比NSKeyedArchiver序列化数据小6倍,并且很容易适应130字节的限制.最棒的是,它只有一行代码.
更新:只是为了擦更多:),这里是NSKeyedArchiver产生的数据(作为图像添加,因为它包含许多我无法复制和粘贴的"非法"字符):

正如您所看到的,它包含许多您不需要的无用数据(突出显示为蓝色),这基本上只是为了提供NSKeyedUnarchiver足够的信息以便以后可以取消归档.
现在,让我们看一下JSON数据:
{"Value3":"12","Value2":"10","Value1":"sadsadasdasdsadqwwqsadasd"}
而已.一条线.66个字节.其中,19个字节不是您的值.换句话说,71%的JSON数据是您的值,其余的是标记,可以这么说.同时,在NSKeyedArchiver数据中,您的值组成,等待它,结果的12%.我想你可以清楚地看到哪一个在这里存储效率更高.
| 归档时间: |
|
| 查看次数: |
1213 次 |
| 最近记录: |