3

gzipで圧縮されたデータを。で解凍しようとしていInflaterます。ドキュメントによると、

パラメータ'nowrap'がtrueの場合、ZLIBヘッダーとチェックサムフィールドは使用されません。これにより、GZIPとPKZIPの両方で使用される圧縮形式との互換性が提供されます。

注:「nowrap」オプションを使用する場合は、入力として追加の「ダミー」バイトを指定する必要もあります。これは、特定の最適化をサポートするためにZLIBネイティブライブラリで必要です。

コンストラクターに渡しtrueてから、データを解凍しようとすると、DataFormatException: invalid block typeスローされます。この回答の指示に従って、setInput()のパラメータの最後にダミーバイトを追加しましたが、役に立ちませんでした。

GZIPInputStream代わりに使用する必要がありますか?私は何が間違っているのですか?

4

2 に答える 2

5

Javaのドキュメントが正しくないか、少なくとも誤解を招く可能性があります。

nowrap-trueの場合、GZIP互換の圧縮をサポートします

nowrapの意味は、生のデフレートデータが解凍されることです。gzipストリームは、gzipヘッダーとトレーラーでラップされた生のdeflateデータです。このクラスでgzip形式を完全にデコードするには、RFC 1952で説明されているようにgzipヘッダーを処理し、inflaterを使用して生のdeflateデータを解凍し、そのクラスを使用して非圧縮データのcrc32を計算してから、crcと再びRFCで指定されているように、gzipトレーラーの長さ(モジュロ2 ^ 32) 。

于 2012-06-18T04:55:37.587 に答える
2

GZIPストリームを読み取るには、設定するだけでは不十分だと思いnowrap=trueます。圧縮ストリームの一部ではないgzipヘッダーも使用する必要があります。たとえばを参照してください。readHeader() この実装では

于 2012-06-18T01:43:55.480 に答える