这里有五种使用gzip的方式,三种需要索引,两种不是。
可以为任何gzip文件创建索引,即不是特别构建的索引,如zran.c所做的那样。然后你可以在块边界开始解压缩。该索引包括每个入口点处的未压缩数据历史记录的32K。
如果您正在构建gzip文件,那么它可以使用定期入口点,其索引不需要在这些入口点处使用未压缩的历史记录,从而形成较小的索引。这是通过zlib中的Z_FULL_FLUSH
选项到deflate()
完成的。
您也可以在每个此类点上执行Z_SYNC_FLUSH
后接Z_FULL_FLUSH
,这会插入两个标记。然后你可以搜索九个字节的模式00 00 ff ff 00 00 00 ff ff
找到那些。这与在bzip2文件中搜索6字节标记没有什么不同,只是9个字节的误报率较低。那么你不需要一个单独的索引文件。
gzip和xz都支持简单的连接。这允许您以另一种方式轻松准备一个用于并行解压缩的归档。总之:
gzip <a> a.gz
gzip <b> b.gz
cat a.gz b.gz > c.gz
gunzip <c.gz> c
cat a b | cmp - c
将导致比较成功。
然后,您可以简单地压缩成所需大小的块并连接结果。将索引保存到每个gzip流开始的偏移量处。从这些偏移量中解压缩。根据您的应用,您可以根据自己的喜好挑选块的大小。如果你让它们太小,压缩将会受到影响。
通过简单地连接gzip文件,如果您将每个块设置为固定的未压缩大小,您也可以放弃索引。然后每个块以相同的四个字节结束,未压缩的长度按小尾序排列,例如, 00 00 10 00
对于1个MiB块,然后是来自下一个块的1f 8b 08
,这是gzip头的开始。这个七字节的标记可以像bzip2标记那样被搜索,尽管再次出现误报的可能性较小。
可以用串联的xz文件完成相同的操作,其头文件是七个字节:fd 37 7a 58 5a 00 00
。
这几天我更喜欢LZ4。 – 2015-02-25 18:55:51
感到惊讶,你遗漏了Zlib。 – nikk 2016-10-25 21:06:58