这里有五种使用 gzip 的方法,三种需要索引,两种不需要。
可以为任何 gzip 文件创建索引,即不是专门构造的,如zran.c所做的那样。然后您可以在块边界处开始解压缩。该索引包括每个入口点的 32K 未压缩数据历史记录。
如果您正在构建 gzip 文件,则可以使用周期性入口点来制作它,其索引不需要在这些入口点处未压缩的历史记录,从而使索引更小。这是通过zlib 中的Z_FULL_FLUSH
选项来完成的。deflate()
您还可以在每个此类点执行 aZ_SYNC_FLUSH
后跟 a ,这将插入两个标记。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 标记一样搜索该 7 字节标记,但误报的可能性更小。
可以对连接的 xz 文件执行相同的操作,其标头是七个字节:fd 37 7a 58 5a 00 00
.