使用zlib的gzip文件访问函数计算未压缩文件大小

7
使用Linux命令行工具gzip,我可以使用gzip -l命令告诉压缩文件的未压缩大小。
在zlib手册的“gzip文件访问函数”部分中,我找不到类似的功能。
在这个链接中http://www.abeel.be/content/determine-uncompressed-size-gzip-file,我找到了一个解决方案,它涉及读取文件的最后4个字节,但我现在避免使用它,因为我更喜欢使用库函数。

注意:我知道有类似的问题,但是它们都没有回答是否实际上有一个zlib函数可以做到这一点。 - André Puel
1个回答

22
没有可靠的方法可以在不解压缩或至少解码整个文件的情况下获取gzip文件的未压缩大小,原因有三个。
首先,关于未压缩长度的唯一信息是位于gzip文件末尾的四个字节(以小端序存储)。必然,这是长度模2^32。因此,如果未压缩长度为4 GB或更多,则无法知道长度。只有在压缩长度小于约2^32 / 1032 + 18(大约为4 MB)时,您才能确定未压缩长度小于4 GB。(1032是deflate的最大压缩因子。)
其次,更糟糕的是,gzip文件实际上可能是多个gzip流的串联。除了解码之外,没有办法找到每个gzip流的结束位置,以查看该部分的四字节未压缩长度。(由于第一个原因可能是错误的。)
第三,gzip文件有时会在gzip流结束后添加垃圾(通常是零)。然后,最后四个字节不是长度。
所以gzip -l实际上并不起作用。因此,在zlib中提供该功能是没有意义的。 pigz有一个选项,可以解码整个输入以获取实际的未压缩长度:pigz -lt,这保证了正确的答案。pigz -l执行与gzip -l相同的操作,可能是错误的。

你知道bzip2是否有相同的限制吗?由于我使用总大小来衡量解压进度,因此首先进行解压不是一个选项。 - André Puel
2
你可以简单地使用压缩数据的消耗来作为进度指示器,而不是生成未压缩的数据。在一定程度上,它们是成比例的,因此您将看到相同的百分比指示。 - Mark Adler
1
“解压缩,或至少解码”是什么意思?“解压缩”和“解码”之间有什么区别? - allyourcode
2
你可以解码哈夫曼编码并计算生成的字节数,而不必实际生成它们。这比完全解压缩更快,因为后者会生成解压缩后的字节。 - Mark Adler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接