gzipを使用する5つの方法、3つはインデックスが必要、2つはインデックスが必要ない方法を次に示します。
zran.cのように、特別に作成されていないgzipファイルのインデックスを作成することができます。次に、ブロック境界で解凍を開始できます。インデックスには、各エントリポイントでの32Kの非圧縮データ履歴が含まれます。
gzipファイルを作成している場合は、定期的なエントリポイントを使用して作成できます。これらのエントリポイントでは、インデックスが非圧縮の履歴を必要としないため、インデックスが小さくなります。これは、zlibのZ_FULL_FLUSH
オプションを使用して実行されます。deflate()
Z_SYNC_FLUSH
また、そのような各ポイントでaZ_FULL_FLUSH
を実行して、2つのマーカーを挿入することもできます。次に、9バイトのパターン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ファイルを単純に連結すると、各チャンクを非圧縮サイズに固定した場合、インデックスを削除することもできます。次に、各チャンクは同じ4バイトで終了し、圧縮されていない長さはリトルエンディアンの順序で終了します。たとえば、1 MiBチャンクの場合は、次のチャンク(gzipヘッダーの開始)が00 00 10 00
続きます。1f 8b 08
その7バイトのマーカーは、bzip2マーカーと同じように検索できますが、誤検知の可能性は低くなります。
ヘッダーが7バイトである連結xzファイルでも同じことができますfd 37 7a 58 5a 00 00
。