2012-02-09 22 views
3

linuxコマンドラインツールgzipの使用gzip -lを使用して圧縮ファイルの圧縮されていないサイズを知ることができます。zlibのgzipファイルアクセス関数を使用した非圧縮ファイルサイズ

zlibのマニュアルセクション "gzipファイルアクセス関数"のような機能が見つかりませんでした。

このリンクでは、ファイルの最後の4バイトを読み取ることを含む解決策http://www.abeel.be/content/determine-uncompressed-size-gzip-fileが見つかりましたが、私はlibの機能を使用する方が好きなので今は避けています。

+0

注:私は似たような質問があることを知っていますが、実際にはそのためのzlib関数があれば答えはありません。 –

答えて

14

解凍せずにgzipファイルの圧縮されていないサイズを取得する方法や、少なくとも全体を解読する方法はありません。 3つの理由があります。

最初に、圧縮されていない長さに関する情報は、gzipファイルの最後(リトルエンディアンの順番で格納されています)の4バイトです。必然的に、それはモジュロ2の長さである。。圧縮されていない長さが4 GB以上であれば、その長さは分かりません。圧縮された長さが2 /1032 + 18、または約4 MB未満の場合は、圧縮されていない長さが4 GB未満であることが分かります。 (1032はデフレートの最大圧縮係数です)

第2に、これは悪いことですが、gzipファイルは実際には複数のgzipストリームを連結したものです。デコード以外にも、4バイトの圧縮されていない長さを見るために各gzipストリームの終わりを見つける方法はありません。 (とにかく最初の理由で間違っているかもしれません)

第3に、gzipファイルはgzipストリームの終わり(通常はゼロ)の後で迷惑をかけることがあります。最後の4バイトは長さではありません。

したがってgzip -lは実際には機能しません。その結果、zlibにその機能を提供することに意味はありません。

pigzには、実際の圧縮されていない長さを得るために入力全体を実際にデコードするオプションがあります。正しい答えが保証されます。pigz -ltpigz -lは何を行うのですか?gzip -lは間違っている可能性があります。

+0

bzip2に同じ制限があるかどうか知っていますか?私は圧縮解除の進行状況を測定するために合計サイズを使用しているので、まず圧縮解除はオプションではありません。 –

+2

圧縮されていないデータの生成ではなく、進行状況インジケータの圧縮データの消費を単純に使用できます。最初に注文すると、それらは比例しているので、同じ%表示が表示されます。 –

+1

「解凍する」、または「少なくとも解読する」とはどういう意味ですか? 「解凍」と「解読」の違いは何ですか? – allyourcode