7

gz の仕様によると、ファイルサイズは .gz ファイルの最後の 4 バイトに保存されます。

で2つのファイルを作成しました

dd if=/dev/urandom of=500M bs=1024 count=500000
dd if=/dev/urandom of=5G bs=1024 count=5000000

私はそれらをgzipしました

gzip 500M 5G

最後の4バイトを確認しました

tail -c4 500M|od -I      (returns 512000000 as expected)
tail -c4 5G|od -I        (returns 825032704 as not expected)

目に見えない 32 ビット バリアに到達すると、ISIZE に書き込まれた値が完全に無意味になるようです。代わりにエラービットを使用した場合よりも、これは面倒です。

解凍せずに .gz から圧縮されていない .gz ファイルサイズを取得する方法を知っている人はいますか?

ありがとう

仕様: http://www.gzip.org/zlib/rfc-gzip.html

編集: 誰かが試してみたい場合は、/dev/urandom の代わりに /dev/zero を使用できます

4

3 に答える 3

8

ありません。

圧縮されたストリームの正確なサイズを取得する唯一の方法は、実際に行って解凍することです(すべてを/ dev / nullに書き込み、バイトを数えるだけの場合でも)。

ISIZEが次のように定義されていることは注目に値します

ISIZE(入力サイズ)これには、 2 ^ 32を法
とする元の(非圧縮)入力データのサイズが含まれます。

gzip RFCでは、実際には32ビットの障壁を破っていないので、表示されているのは予想される動作です。

于 2009-12-27T09:26:49.313 に答える
3

あなたが言及したサイズのファイルでこれを試したことはありませんが、.gzファイルの非圧縮サイズが

zcat file.gz | wc -c

圧縮されていないファイルをそのままにしておきたくない場合、またはわざわざファイルを再度圧縮したくない場合。

明らかに、データは圧縮されていませんが、にパイプされwcます。

とにかく、試してみる価値はあります。

編集: / dev / randomからのデータを使用して5Gファイルを作成しようとすると5G、サイズ5120000000のファイルが生成されましたが、ファイルマネージャーはこれを4.8Gと報告しました

次に、で圧縮しましgzip 5Gた。結果は同じサイズでした(ランダムデータ5G.gzの圧縮はそれほど多くありません)。

次にzcat 5G.gz | wc -c、元のファイルと同じサイズ(5120000000バイト)を報告しました。とにかく、私の提案はこの裁判でうまくいったようでした。

お待たせしました

于 2009-12-27T09:24:35.993 に答える
0

gzip には -l オプションがあります。

       -l --list
          For each compressed file, list the following fields:

              compressed size: size of the compressed file
              uncompressed size: size of the uncompressed file
              ratio: compression ratio (0.0% if unknown)
              uncompressed_name: name of the uncompressed file

          The uncompressed size is given as -1 for files not in gzip format, such as compressed .Z files. To
          get the uncompressed size for such a file, you can use:

              zcat file.Z | wc -c

          In combination with the --verbose option, the following fields are also displayed:

              method: compression method
              crc: the 32-bit CRC of the uncompressed data
              date & time: time stamp for the uncompressed file

          The compression methods currently supported are deflate, compress, lzh (SCO compress -H) and pack.
          The crc is given as ffffffff for a file not in gzip format.

          With --name, the uncompressed name,  date and time  are those stored within the compress  file  if
          present.

          With --verbose, the size totals and compression ratio for all files is also displayed, unless some
          sizes are unknown. With --quiet, the title and totals lines are not displayed.
于 2013-10-17T20:15:24.813 に答える