私は別のアプリケーションで圧縮されたデータを解凍する必要があるアプリケーションを作成しています(これは私のコントロール外です - ソースコードを変更することはできません)。プロデューサアプリケーションは、zlibを使用してz_streamメカニズムを使用してデータを圧縮します。それはZ_FULL_FLUSHを頻繁に使用します(おそらくあまりにも頻繁に、私の意見では、別の問題です)。このサードパーティのアプリケーションでは、独自のデータを解凍することもできるため、データそのものが正しいと確信しています。私のテストでzlib解凍に失敗する
、私は(16進数)は、次の単純なテキストファイルを圧縮するために、このサードパーティのアプリを使用しています:
48 65 6c 6c 6f 20 57 6f 72 6c 64 21 0d 0a
を私はアプリから受け取った圧縮バイトは、(再び、このようになります、16進数):
:私は、同じデータを試してみて、圧縮した場合78 9c f2 48 cd c9 c9 57 08 cf 2f ca 49 51 e4 e5 02 00 00 00 ff ff
、私は非常によく似た結果が得られます0
78 9c f3 48 cd c9 c9 57 08 cf 2f ca 49 51 e4 e5 02 00 24 e9 04 55
私が見ることができる2つの違いがあります。
まず、4番目のバイトではなくF3
よりも、F2
ので、デフレート「最後のブロック」ビットが設定されていません。これは、ストリームインターフェイスが着信データの終わりを知ることがないので、そのビットを決して設定しないと仮定します。
最後に、外部データの最後の4バイトは00 00 FF FF
ですが、私のテストデータでは24 E9 04 55
です。私の周りに検索することは、これは同期またはフルフラッシュの署名であることを...このページに
http://www.bolet.org/~pornin/deflate-flush.html
を見つけました。
decompress()
機能を使用して自分のデータを解凍しようとすると、すべて正常に動作します。しかし、外部データを試して解凍すると、decompress()
ファンクションコールは、壊れたデータを示すZ_DATA_ERROR
の戻りコードで失敗します。
私はいくつかの質問があります:
私はz_stream方式で圧縮されたデータを解凍するためにzlibの「解凍」機能を使用することができるはずですが?
上記の例では、最後の4バイトの意味は何ですか?外部圧縮データストリームと私自身のテストデータストリームの長さが同じであれば、最後の4バイトは何を表していますか?
乾杯
私はこれについては何の手掛かりもありませんが、質問に追加することを忘れた情報の潜在的に関連性のあるビットは、zlibの復元がどのくらい正確に失敗するかです。 –
ありがとうございました。 – Thomi