3.1.1.1. Frame Header (フレームヘッダー)
フレームヘッダーのサイズは可変で、最小 2 バイト、最大 14 バイトで、オプションのパラメータによって異なります。Frame_Header の構造は次のとおりです:
+-------------------------+-----------+
|| Frame_Header_Descriptor | 1 byte |
+-------------------------+-----------+
|| [Window_Descriptor] | 0-1 byte |
+-------------------------+-----------+
|| [Dictionary_ID] | 0-4 bytes |
+-------------------------+-----------+
|| [Frame_Content_Size] | 0-8 bytes |
+-------------------------+-----------+
表 2: Frame_Header の構造
3.1.1.1.1. Frame_Header_Descriptor (フレームヘッダー記述子)
ヘッダーの最初のバイトは Frame_Header_Descriptor と呼ばれます。これは、他のどのフィールドが存在するかを記述します。このバイトをデコードするだけで、Frame_Header のサイズを決定できます。
| ビット番号 (Bit Number) | フィールド名 (Field Name) |
|---|---|
| 7-6 | Frame_Content_Size_Flag |
| 5 | Single_Segment_Flag |
| 4 | (未使用, unused) |
| 3 | (予約済み, reserved) |
| 2 | Content_Checksum_Flag |
| 1-0 | Dictionary_ID_Flag |
表 3: Frame_Header_Descriptor
表 3 では、ビット 7 が最上位ビットで、ビット 0 が最下位ビットです。
3.1.1.1.1.1. Frame_Content_Size_Flag (フレームコンテンツサイズフラグ)
これは 2 ビットフラグ (Frame_Header_Descriptor を 6 ビット右シフトしたものに相当) で、Frame_Content_Size (解凍データサイズ) がヘッダー内に提供されるかどうかを指定します。Frame_Content_Size_Flag は、表 4 に従って Frame_Content_Size が使用するバイト数である FCS_Field_Size を提供します:
| Frame_Content_Size_Flag | 0 | 1 | 2 | 3 |
|---|---|---|---|---|
| FCS_Field_Size | 0 または 1 | 2 | 4 | 8 |
表 4: Frame_Content_Size_Flag が FCS_Field_Size を提供
Frame_Content_Size_Flag が 0 の場合、FCS_Field_Size は Single_Segment_Flag に依存します: Single_Segment_Flag が設定されている場合、FCS_Field_Size は 1 です。それ以外の場合、FCS_Field_Size は 0 で、Frame_Content_Size は提供されません。
3.1.1.1.1.2. Single_Segment_Flag (単一セグメントフラグ)
このフラグが設定されている場合、データは単一の連続したメモリセグメント内で再生成される必要があります。
この場合、Window_Descriptor バイトはスキップされますが、Frame_Content_Size は存在する必要があります。したがって、デコーダは Frame_Content_Size 以上のサイズのメモリセグメントを割り当てる必要があります。
デコーダを不合理なメモリ要求から保護するために、デコーダは、デコーダの承認範囲内のメモリサイズを超える要求をする圧縮フレームを拒否することが許可されています。
より広い互換性のために、デコーダは少なくとも 8 MB のメモリサイズをサポートすることが推奨されます。これは推奨事項にすぎません。各デコーダは、ローカルの制限に基づいて、より高いまたはより低い制限を自由にサポートできます。
3.1.1.1.1.3. Unused Bit (未使用ビット)
本仕様のバージョンに準拠するデコーダは、このビットを解釈してはなりません。これは、将来のバージョンで、フレームを正しくデコードするために必須ではない属性を表すために使用される可能性があります。本仕様に準拠するエンコーダは、このビットをゼロに設定する必要があります。
3.1.1.1.1.4. Reserved Bit (予約済みビット)
このビットは、将来の機能のために予約されています。その値はゼロである必要があります。本仕様のバージョンに準拠するデコーダは、これが設定されていないことを確認する必要があります。このビットは、将来のリビジョンで、フレームを正しくデコードするために解釈する必要がある機能を表すために使用される可能性があります。
3.1.1.1.1.5. Content_Checksum_Flag (コンテンツチェックサムフラグ)
このフラグが設定されている場合、フレームの最後に 32 ビットの Content_Checksum が存在します。上記の Content_Checksum の説明を参照してください。
3.1.1.1.1.6. Dictionary_ID_Flag (辞書IDフラグ)
これは 2 ビットフラグ (= Frame_Header_Descriptor & 0x3) で、辞書 ID がヘッダー内に提供されるかどうかを示します。また、このフィールドのサイズを DID_Field_Size として指定します:
| Dictionary_ID_Flag | 0 | 1 | 2 | 3 |
|---|---|---|---|---|
| DID_Field_Size | 0 | 1 | 2 | 4 |
表 5: Dictionary_ID_Flag
3.1.1.1.2. Window Descriptor (ウィンドウ記述子)
これは、フレームを解凍するために必要な最小メモリバッファに関する保証を提供します。この情報は、デコーダが十分なメモリを割り当てるために重要です。
Window_Descriptor バイトはオプションです。Single_Segment_Flag が設定されている場合、Window_Descriptor は存在しません。この場合、Window_Size は Frame_Content_Size であり、その値は 0 から 2^64 - 1 バイト (16 ExaBytes) までです。
| ビット番号 (Bit Number) | 7-3 | 2-0 |
|---|---|---|
| フィールド名 (Field Name) | Exponent (指数) | Mantissa (仮数) |
表 6: Window_Descriptor
最小メモリバッファサイズは Window_Size と呼ばれます。これは次の式で記述されます:
windowLog = 10 + Exponent;
windowBase = 1 << windowLog;
windowAdd = (windowBase / 8) * Mantissa;
Window_Size = windowBase + windowAdd;
最小 Window_Size は 1 KB です。最大 Window_Size は (1<<41) + 7*(1<<38) バイト、つまり 3.75 TB です。
一般に、より大きな Window_Size 値は、メモリ使用量の増加を犠牲にして、圧縮率を向上させる傾向があります。
圧縮データを正しくデコードするには、デコーダは少なくとも Window_Size バイトのバッファを割り当てる必要があります。
デコーダを不合理なメモリ要求から保護するために、デコーダは、デコーダの承認範囲内のメモリサイズを超える要求をする圧縮フレームを拒否することが許可されています。
相互運用性を向上させるために、デコーダは最大 8 MB の Window_Size 値をサポートし、エンコーダは 8 MB を超える Window_Size を必要とするフレームを生成しないことが推奨されます。これは推奨事項にすぎず、デコーダはローカルの制限に基づいて、より高いまたはより低い制限を自由にサポートできます。
3.1.1.1.3. Dictionary_ID (辞書ID)
これは、フレームを正しくデコードするために必要な辞書 ID を含む可変サイズのフィールドです。このフィールドはオプションです。存在しない場合、使用する辞書を決定するのはデコーダ次第です。
Dictionary_ID フィールドのサイズは DID_Field_Size によって提供されます。DID_Field_Size は Dictionary_ID_Flag の値から直接派生します。1 バイトで ID 0-255 を表現でき、2 バイトで ID 0-65535 を表現でき、4 バイトで ID 0-4294967295 を表現できます。フォーマットはリトルエンディアンです。
大きな 4 バイト辞書 ID を使用して小さな ID (たとえば 13) を表現することは、効率が悪くても許可されています。
プライベート環境では、任意の辞書 ID を使用できます。ただし、公共空間で配布されるフレームと辞書の場合、Dictionary_ID は慎重に割り当てる必要があります。次の範囲は、IANA に登録された辞書専用に予約されています (セクション 7.4 を参照):
- 低範囲 (low range):
<= 32767 - 高範囲 (high range):
>= (1 << 31)
Dictionary_ID の他の値は、参加者間の私的な取り決めによって使用できます。
登録されていない予約済み辞書 ID を参照する解凍用に送信された有効なペイロードは、エラーになります。
3.1.1.1.4. Frame_Content_Size (フレームコンテンツサイズ)
これは元の (圧縮されていない) サイズです。この情報はオプションです。Frame_Content_Size は可変バイト数を使用し、FCS_Field_Size によって提供されます。FCS_Field_Size は Frame_Content_Size_Flag の値によって提供されます。FCS_Field_Size は 0 (存在しない)、1、2、4、または 8 バイトに等しくなります。
| FCS Field Size (フィールドサイズ) | Range (範囲) |
|---|---|
| 0 | unknown (不明) |
| 1 | 0 - 255 |
| 2 | 256 - 65791 |
| 4 | 0 - 2^32 - 1 |
| 8 | 0 - 2^64 - 1 |
表 7: Frame_Content_Size
Frame_Content_Size フォーマットはリトルエンディアンです。FCS_Field_Size が 1、4、または 8 バイトの場合、値は直接読み取られます。FCS_Field_Size が 2 の場合、256 のオフセットが追加されます。小さいサイズ (たとえば 18) を表現するために互換性のある任意のバリアントを使用することは、効率が悪くても許可されています。