gzip
RFC 1952 GZIP file format specification version 4.3 RFC 1951 DEFLATE Compressed Data Format Specification version 1.3 RFC 6713 The 'application/zlib' and 'application/gzip' Media Types
RFC 1952
1.はじめに
1.1. 目的
本仕様の目的は、以下の要件を満たすロスレス圧縮データ形式を定義することです。
CPUの種類、オペレーティングシステム、ファイルシステム、および文字セットに依存しないため、データ交換に使用できます。
データストリーム(ランダムアクセス可能なファイルとは対照的に)を圧縮または解凍して別のデータストリームを生成でき、事前に制限された量の中間ストレージのみを使用できるため、データ通信やUnixフィルタなどの類似の構造で使用できます。
現在利用可能な最高の汎用圧縮方式に匹敵する効率でデータを圧縮します。特に「compress」プログラムよりも大幅に優れています。
特許で保護されない方法で容易に実装できるため、自由に実施できます。
現在広く使用されているgzipユーティリティによって生成されるファイル形式と互換性があり、準拠した解凍プログラムは既存のgzip圧縮プログラムによって生成されたデータを読み取ることができます。
本仕様で定義されるデータ形式は、以下のことを目的としていません。
圧縮データへのランダムアクセスを提供すること。
特殊なデータ (ラスター グラフィックなど) を、現在利用可能な最良の特殊なアルゴリズムとともに圧縮します。
1.2. 対象読者
本仕様は、データをgzip形式に圧縮したり、gzip形式からデータを解凍したりするソフトウェアの実装者を対象としています。
本仕様の本文は、ビットレベルおよびその他の基本的なデータ表現におけるプログラミングの基礎知識を前提としています。
1.3. 適用範囲
本仕様は、圧縮方式とファイル形式を規定します(後者は、ファイルが任意のバイト列を格納できることのみを前提としています)。ファイルシステムへの特定のインターフェースや、文字セットやエンコーディングについては規定していません(ファイル名とコメントは任意です)。
1.4. 準拠
以下で特に明記されていない限り、準拠する解凍プログラムは、ここで提示されるすべての仕様に準拠するファイルを受け入れ、解凍できなければなりません。また、準拠する圧縮プログラムは、ここで提示されるすべての仕様に準拠するファイルを生成しなければなりません。付録の内容は、仕様自体の一部ではなく、準拠とは関係ありません。
1.5. 用語の定義と表記規則
バイト: 8ビットを1単位として保存または転送する単位(オクテットと同じ)。
(本仕様では、1文字を8ビット以外のビット数で保存するマシンであっても、1バイトは正確に8ビットです。)1バイト内のビット番号については、以下を参照してください。
1.6. 以前のバージョンからの変更点
本仕様のバージョン4.1以降、gzip形式には技術的な変更はありません。バージョン4.2では、一部の用語が変更され、サンプルCRCコードが書き直され、明確化と呼び出し側での事前および事後処理の必要性の排除が図られました。バージョン4.3は、仕様をRFCスタイルに変換したものです。
2. 詳細仕様
2.1. 全体的な表記規則
以下の図では、次のようなボックスは1バイトを表します。
code:box
+---+
| | <-- 縦線が抜けている可能性があります
+---+
は1バイトを表します。また、次のようなボックスは可変長バイトを表します。
code:variable
+================+
| |
+================+
は可変長バイトを表します。
コンピュータに格納されるバイトには「ビット順序」はありません。これは、バイトが常に1つの単位として扱われるためです。ただし、0から255までの整数とみなされるバイトには最上位ビットと最下位ビットがあり、数値は最上位桁を左側に記述するため、バイトも最上位ビットを左側に記述します。以下の図では、バイトのビットをビット0が最下位ビットとなるように番号付けしています。つまり、ビットは次のように番号付けされています。
code:bit
+--------+
|76543210|
+--------+
この文書では、ビットシーケンシャルメディア上でバイトのビットが送信される順序については扱いません。これは、ここで説明するデータ形式がビット指向ではなくバイト指向であるためです。
コンピュータ内では、数値が複数のバイトを占める場合があります。ここで説明する形式のマルチバイト数値はすべて、最下位バイトから(メモリの下位アドレスに)格納されます。
例えば、10進数520は次のように格納されます。
code:520
0 1
+--------+--------+
|00001000|00000010|
+--------+--------+
^ ^
| |
| + 上位バイト = 2 x 256
+ 下位バイト = 8
2.2. ファイル形式
gzipファイルは、一連の「メンバー」(圧縮データセット)で構成されます。各メンバーの形式は、以下のセクションで規定されています。メンバーはファイル内に順番に出現し、メンバーの前後や間には追加情報は含まれません。
2.3. メンバー形式
各メンバーは以下の構造を持ちます。
code:structure
+---+---+---+---+---+---+---+---+---+---+
|ID1|ID2|CM |FLG| MTIME |XFL|OS | (続き -->)
+---+---+---+---+---+---+---+---+---+---+
(FLG.FEXTRA が設定されている場合)
code:FLG.FEXTRA
+---+---+=====================================+
| XLEN |...XLEN バイトの「追加フィールド」 ...| (続き -->)
+---+---+=====================================+
(FLG.FNAME が設定されている場合)
code:FLG.FNAME
+=============================+
|...ゼロ終端の元のファイル名...| (続き -->)
+=============================+
(FLG.FCOMMENT が設定されている場合)
code:FCOMMENT
+===============================+
|...ファイルコメント、ゼロ終端...| (続き -->)
+===============================+
(FLG.FHCRC が設定されている場合)
code:FHCRC
+---+---+
| CRC16 |
+---+---+
+=================+
|...圧縮ブロック...| (続き-->)
+=================+
0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+
| CRC32 | ISIZE |
+---+---+---+---+---+---+---+---+