2012-10-31 12 views
5

これを行う方法はあると思いますが、どうすればよいかわかりません。基本的には、圧縮データを解凍しようとしたときにcrcエラーが発生する圧縮プログラムを作成していました。通常、デコンプレッサーは実際に自分のデータを適切なフォーマットであると認識して圧縮解除しましたが、CRCで示されているように予想された長さと結果を比較すると同じではありませんでした。CRCエラーにもかかわらず、gzipに圧縮解除を強制する

しかし、比較の理由から、実際に出力を見て、それが単なる連結問題であるかどうかを確認したいとします(圧縮解除された出力がちょっと誤った順番である場合には明らかです)。

答えて

0

私が知る限り、CRCチェックはGZIPラッパーの一部であり、DEFLATE形式の実際の圧縮データの一部ではありません。

圧縮されたデータストリームであるバイトだけをそのまま使用し、最後にGZIPヘッダーとCRCを無視してInflaterに渡す必要があります。

つまり、GZIP File format specificationで「圧縮ブロック」と呼ばれるものに対応するバイトだけを取り出し、Java Inflaterオブジェクトを使用して解凍を試みる必要があります。 Gregが示唆しているように、GZIPコードを再コンパイルするよりも少し仕事が少なくなるかもしれません(しかし、彼の選択肢も原則として機能します)。

8

あなたは「解凍」と言っていますが、質問に「gzip」と書かれています。どちらですか?これらは、2つの異なるフォーマットで動作する2つの異なるプログラムです。私はgzipと仮定します。また、長さは「CRCによって示される」ではない。 gzipトレーラーには、2つの異なるものであるCRCと非圧縮長(modulo 2 )が含まれています。

gzipコマンドは、crcをチェックする前にすべての有効なデフレートデータを解凍して書き出します。例えば、私が最後に.gzファイルや破損しているだけで、CRC(または長さ)を取る、と行う、のであれば:

gzip -dc <corrupt.gz> result 

は、全体の、正しい非圧縮データストリームになる結果。 gzipを変更して再コンパイルする必要はなく、独自のungzipperも作成する必要はありません。 gzipはcrcについて文句を言いますが、データはすべて書き込まれます。