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 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/zero 而不是 /dev/urandom

4

3 回答 3

8

没有一个。

获得压缩流的确切大小的唯一方法是实际去解压缩它(即使您将所有内容都写入 /dev/null 并且只计算字节数)。

值得注意的是,ISIZE 定义为

ISIZE (Input SIZE)
这包含原始(未压缩)输入
数据模 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 回答