gpt4 book ai didi

ios - 将NSDictionary压缩为NSData的有效方法

转载 作者:行者123 更新时间:2023-12-01 17:41:32 24 4
gpt4 key购买 nike

我正在使用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]);

最佳答案

我认为尝试使用任何形式的压缩都不会奏效,甚至在这种规模上也不会有所改善,因为所有压缩算法在有大量数据需要处理时效果最佳,因此有很多重复和模式可用于找。当您的整个数据大小为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%。我认为您可以清楚地看到哪一种存储效率更高。

关于ios - 将NSDictionary压缩为NSData的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17635781/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com