0

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 (サーバー上) とうまく連携させる方法はありますか?

4

1 に答える 1

1

あなたの推測は残念ながら正しくありません。zlib のすべてのバージョンは、zlib の他のすべてのバージョンによって生成された圧縮データを前後に解凍できます。1.2.3 に戻しても役に立ちません。

問題は、gzip ストリームがあるのに、zlib にそれを zlib ストリームとしてデコードするように要求していることです。gzip と zlib は、deflate 圧縮データの異なるラッパーです。gzip ストリームをデコードするには、zlib に依頼する必要があります。

パラメータでそれを行うことができwbitsます。試してみてくださいzlib.decompress(decoded, 31)

アップデート:

彼らの zlib モジュールに関するPython ドキュメントを見てみましたが、ひどいものでした。デザインにも問題があります。このページのタイトルは「12.1. zlib — gzip と互換性のある圧縮」です。ただし、関数zlib.compresszlib.compressobj関数は zlib 形式に圧縮されます。これはgzip と互換性がありません! さらに、実際の zlib ライブラリがサポートzlib.compressする gzip 形式を生成するオプションを提供する方法はないようです。(上記の のオプションに類似するものはなく、実際には gzip 入力のデコードを許可します。)zlib.decompress

wbitsのパラメーターのドキュメントには、15 を超える値zlib.decompressの可能性とその機能については言及されていません。wbits実際、最高値は 15 です。

wbitsにパラメータを指定しても意味zlib.decompressがありませんが、 には指定しませんzlib.compress。通常の値 (8..15) の要点は、解凍に必要なメモリが少ない圧縮ストリームを生成できるようにすることです。それらを生成できない場合、wbits8..14 のパラメーターを指定して、それが機能することを期待できるケースはありません。

負のwbits値のドキュメントには、標準の gzip ヘッダーが抑制されていることが記載されています。彼らはその中で2つの間違いを犯しました。まず、抑制は圧縮データの周りのラッパーを抑制することによって、コンプレッサーが行うことです。その場合の圧縮解除プログラムは、ラッパーを探すのではなく、生の deflate データをデコードするだけです。zlib.compress第 2 に、モジュールが生成できない gzip ラッパーではなく、によって生成された場合に無視される zlib ラッパーになります。

問題を見つけ続けているので、今は読むのをやめようと思います。

于 2012-05-16T05:13:29.507 に答える