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

And*_*uel 5 c c++ gzip zlib

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

我在zlib手册部分"gzip文件访问函数"中找不到任何类似的函数.

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

Mar*_*ler 16

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

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

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

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

所以gzip -l无论如何都没有真正的工作.因此,在zlib中提供该功能毫无意义.

pigz有一个选项,实际上解码整个输入,以获得实际的未压缩长度:pigz -lt,这保证了正确的答案. pigz -l做什么gzip -l,可能是错的.

  • 您可以简单地使用压缩数据的消耗作为进度指示器,而不是生成未压缩的数据.首先,它们是成比例的,所以你会看到相同的%指示. (2认同)
  • 您可以解码霍夫曼代码并计算生成的字节数,而不实际生成它们.这比完全解压缩更快,后者生成解压缩的字节. (2认同)