1

GZIPファイルを解凍するCプログラムを学習目的で書いています。

GZIP仕様によると

gzip ファイルは、一連の「メンバー」(圧縮されたデータ セット) で構成されます。各メンバーの形式は、次のセクションで指定します。メンバーは、ファイル内で次々に出現するだけで、メンバーの前、間、後に追加情報はありません。

1 つのメンバーは、ヘッダー (いくつかのフラグ値に応じてオプションのフィールドを含む場合があります)、いくつかの圧縮ブロック (deflate アルゴリズムを使用)、および最後に CRC32 と元の圧縮されていないファイルのサイズで構成されます。

2 つの質問があります。

  1. メンバーを区切るにはどうすればよいですか? 実際には、1 つの gzip ファイルに複数のメンバーが含まれているのでしょうか。1つのメンバーが1つのファイルに対応しているようです(たとえば、ファイル名ヘッダー)
  2. トレーラーから最後のブロックを区切るにはどうすればよいですか (CRC + SIZE)?
4

2 に答える 2

5

一般的ではありませんが、1 つのファイルに連結された gzip ストリームが表示されることがあります。gzip は、複数の「ファイル」ではなく、単一のデータ ストリームと見なすため、ファイル名は無視されます。

「最後のブロックをどのように区切るか」が最後の deflate ブロックを意味する場合、最後の deflate ブロックには、最後のブロックとしてマークするビットがヘッダーに含まれているだけです。最後の deflate ブロックの後には、crc と圧縮されていない長さ (モジュロ 2^32) が続きます。

于 2012-07-18T15:46:40.387 に答える