我想安装libz.1.2.3.dylib用于构建iPhone应用程序。 OS X 10.7.4具有libz.1.2.5.dylib。但是,我发送gzip压缩数据的服务器有zlib 1.2.3(由Python使用)。并且,当它尝试解压缩gzip压缩数据时,会出错:
encoded = 'H4sIAAAAAAAAA4uuVspTslLySi0uTlVwSs0rSS0qUdJRygSKGQHpAiWraCVDS0MTY0MLUwszc6XYWh2ojvyMPAX3osSMxFyoekO4egsTc1NjY3NLCxOE+qDEvJR8BZfSlFSoclNDA2O4DnMLc3MDCwMDAwugjlgAp2IZdpUAAAA='
>>> decoded = base64.b64decode(encoded)>>> zlib.decompress(decoded)Traceback (most recent call last):
File "<stdin>", line 1, in <module>
zlib.error: Error -3 while decompressing data: incorrect header check
>>> zlib.decompress(decoded, 16)Traceback (most recent call last):
File "<stdin>", line 1, in <module>
zlib.error: Error -2 while preparing to decompress data
但是,它适用于我本地计算机上的Python。
所以,我猜测用libz.1.2.3.dylib构建iOS应用程序会解决问题。如果这是最好的方法,我该如何安装?否则,是否有办法使zlib 1.2.5(在OS X 10.7上)与libz 1.2.3(在服务器上)配合使用?
答案 0 :(得分:1)
不幸的是,您的猜测不正确。所有版本的zlib都可以解压缩所有其他版本的zlib,前向和后向生成的压缩数据。回到1.2.3无济于事。
问题是你有一个gzip流,但是你要求zlib将它解码为zlib流。 gzip和zlib是针对deflate压缩数据的不同包装器。您需要让zlib解码gzip流。
您可以使用wbits
参数执行此操作。试试zlib.decompress(decoded, 31)
。
<强>更新强>
我看了一下Python documentation on their zlib module,这太可怕了。设计也存在问题。该页面标题为“12.1.zlib - 与gzip兼容的压缩”。但是zlib.compress
和zlib.compressobj
函数压缩为zlib格式, 与gzip兼容!此外,似乎无法为zlib.compress
提供生成actual zlib library支持的gzip格式的选项。 (没有什么类似于上面提到的zlib.decompress
选项,实际上它允许解码gzip输入。)
wbits
zlib.decompress
参数的文档未提及wbits
值大于15的可能性以及它们的作用。实际上它说最高值是15。
为wbits
提供zlib.decompress
参数是没有意义的,但不是zlib.compress
。通常值(8..15)的要点是允许生成需要较少内存的压缩流进行解压缩。如果你不能生成它们,那么从来没有一种情况可以提供8 {14的wbits
参数并期望它能够正常工作。
负wbits
值的文档说明标准gzip标头被抑制。他们设法在那一个犯了两个错误。首先,通过抑制放气数据周围的包装,抑制就是压缩器的作用。在这种情况下,解压缩器只是解码原始的deflate数据,而不是寻找包装器。其次,它将是一个zlib包装器,如果由zlib.compress
生成,则会被忽略,而不是模块无法生成的gzip包装器。
我想我现在就停止阅读,因为我一直在寻找问题。