使用zlib的gzip文件访问功能解压缩文件大小

时间:2012-02-09 10:27:59

标签: c++ c gzip zlib

使用linux命令行工具gzip我可以使用gzip -l告诉压缩文件的未压缩大小。

我在zlib手册“gzip文件访问功能”部分找不到任何类似的功能。

在这个链接上,我找到了一个解决方案http://www.abeel.be/content/determine-uncompressed-size-gzip-file,它涉及读取文件的最后4个字节,但我现在正在避免它,因为我更喜欢使用lib的函数。

1 个答案:

答案 0 :(得分:16)

没有可靠的方法来获取gzip文件的未压缩大小而不解压缩,或至少解码整个事物。原因有三个。

首先,关于未压缩长度的唯一信息是gzip文件末尾的四个字节(以little-endian顺序存储)。必要时,这是模2 32 的长度。因此,如果未压缩的长度为4 GB或更多,您将无法知道长度是多少。如果压缩长度小于2 32 / 1032 + 18,或大约4 MB,则只能确定未压缩长度小于4 GB。 (1032是放气的最大压缩系数。)

其次,更糟糕的是,gzip文件实际上可能是多个gzip流的串联。除了解码之外,没有办法找到每个gzip流结束的位置,以便查看该块的四字节未压缩长度。 (由于第一个原因,这可能是错误的。)

第三,gzip文件有时会在gzip流结束后出现垃圾(通常为零)。那么最后四个字节不是长度。

所以gzip -l无论如何都不起作用。因此,在zlib中提供该功能毫无意义。

pigz实际上可以解码整个输入,以获得实际的未压缩长度:pigz -lt,这可以保证正确的答案。 pigz -l执行gzip -l所做的事情,这可能是错误的。