0

我想安装 libz.1.2.3.dylib 以用于构建 iPhone 应用程序。OS X 10.7.4 有 libz.1.2.5.dylib。但是,我将压缩数据发送到的服务器具有 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(在服务器上)配合得很好?

4

1 回答 1

1

不幸的是,您的猜测不正确。所有版本的 zlib 都可以解压缩所有其他版本的 zlib 产生的压缩数据,向前和向后。回到 1.2.3 将无济于事。

问题是您有一个 gzip 流,但您要求 zlib 将其解码为 zlib 流。gzip 和 zlib 是 deflate 压缩数据的不同包装器。您需要让 zlib 解码 gzip 流。

您可以使用wbits参数执行此操作。试试zlib.decompress(decoded, 31)

更新:

我查看了他们 zlib 模块上的 Python文档,这太可怕了。设计也有问题。该页面的标题为“12.1.zlib — 与 gzip 兼容的压缩”。然而zlib.compressandzlib.compressobj函数压缩为 zlib 格式,与 gzip兼容!此外,似乎没有办法提供zlib.compress生成 gzip 格式的选项,而实际的 zlib 库支持这种格式。(与上面提到的选项没有什么相似之处,zlib.decompress实际上它确实允许解码 gzip 输入。)

wbits参数的文档zlib.decompress没有提到wbits超过 15 的值的可能性以及它们的作用。事实上,它说最高值为 15。

为 提供wbits参数是没有意义的zlib.decompress,但不是zlib.compress。通常值 (8..15) 的全部意义在于允许生成需要较少内存来解压缩的压缩流。如果你不能生产它们,那么你永远不会提供wbits8..14 的参数并期望它能够工作。

负值的文档wbits说标准 gzip 标头被禁止。他们设法在那一次犯了两个错误。首先,抑制是压缩器会做的事情,通过抑制放气数据周围的包装器。在这种情况下,解压缩器只是解码原始 deflate 数据,而不是寻找包装器。其次,如果由 生成,它将是一个 zlib 包装器,而zlib.compress不是模块无论如何都无法生成的 gzip 包装器。

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

于 2012-05-16T05:13:29.507 回答