如何在OS X 10.7上安装libz.1.2.3.dylib?

时间:2012-05-15 22:40:01

标签: python gzip iphone

我想安装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(在服务器上)配合使用?

1 个答案:

答案 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.compresszlib.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包装器。

我想我现在就停止阅读,因为我一直在寻找问题。