在64位平台上获取非常大的.gz文件的文件大小

mon*_*ing 7 64-bit gzip 32-bit filesize gunzip

根据gz的具体情况,filesize保存在.gz文件的最后4个字节中.

我创建了2个文件

dd if=/dev/urandom of=500M bs=1024 count=500000
dd if=/dev/urandom of=5G bs=1024 count=5000000
Run Code Online (Sandbox Code Playgroud)

我gziped他们

gzip 500M 5G
Run Code Online (Sandbox Code Playgroud)

我检查了最后4个字节

tail -c4 500M|od -I      (returns 512000000 as expected)
tail -c4 5G|od -I        (returns 825032704 as not expected)
Run Code Online (Sandbox Code Playgroud)

它似乎击中了看不见的32位屏障,使得写入ISIZE的价值完全无稽之谈.哪个更令人讨厌,而不是他们使用了一些错误位.

有没有人知道从.gz获取未压缩的.gz文件大小而不提取它的方法?

谢谢

规范:http://www.gzip.org/zlib/rfc-gzip.html

编辑:如果有人尝试,你可以使用/ dev/zero而不是/ dev/urandom

Kev*_*ose 8

没有一个.

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

值得注意的是,ISIZE被定义为

ISIZE(输入大小)
它包含原始(未压缩)输入
数据模2 ^ 32的大小.

在gzip RFC中,它实际上并没有在32位屏障中突破,你所看到的是预期的行为.