将NSDictionary压缩为NSData的有效方法

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)

Gre*_*reg 6

我不认为尝试使用任何形式的压缩都是有效的,甚至在这种规模上都没有改进,因为所有压缩算法在有大量数据可用时效果最好,因此有许多重复和模式到找.当您的整个数据大小为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产生的数据(作为图像添加,因为它包含许多我无法复制和粘贴的"非法"字符):

NSKeyedArchiver数据

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

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

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

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