3.1.1.2. Blocks (ブロック)
Magic_Number と Frame_Header の後に、いくつかのブロックがあります。各フレームには少なくとも 1 つのブロックが必要ですが、フレームあたりのブロック数に上限はありません。
ブロックの構造は次のとおりです:
+==============+===============+
|| Block_Header | Block_Content |
+==============+===============+
|| 3 bytes | n bytes |
+--------------+---------------+
表 8: ブロックの構造
Block_Header は 3 バイトを使用し、リトルエンディアン規約で記述されます。3 つのフィールドが含まれます:
| Last_Block | Block_Type | Block_Size |
|---|---|---|
| bit 0 | bits 1-2 | bits 3-23 |
表 9: Block_Header
3.1.1.2.1. Last_Block (最後のブロック)
最下位ビット (Last_Block) は、これが最後のブロックかどうかを示します。フレームはこの最後のブロックの後に終了します。オプションの Content_Checksum が続く場合があります (セクション 3.1.1 を参照)。
3.1.1.2.2. Block_Type (ブロックタイプ)
次の 2 ビットは Block_Type を表します。4 つのブロックタイプがあります:
| Value (値) | Block_Type (ブロックタイプ) |
|---|---|
| 0 | Raw_Block (生ブロック) |
| 1 | RLE_Block (RLEブロック) |
| 2 | Compressed_Block (圧縮ブロック) |
| 3 | Reserved (予約済み) |
表 10: 4 つのブロックタイプ
Raw_Block (生ブロック) : これは圧縮されていないブロックです。Block_Content には Block_Size バイトが含まれます。
RLE_Block (RLEブロック) : これは Block_Size 回繰り返される単一バイトです。Block_Content は単一バイトで構成されます。解凍側では、このバイトを Block_Size 回繰り返す必要があります。
Compressed_Block (圧縮ブロック) : これはセクション 3.1.1.3 で説明されている圧縮ブロックです。Block_Size は Block_Content の長さ、つまり圧縮データです。解凍サイズは不明ですが、その最大可能値は保証されています (以下を参照)。
Reserved (予約済み) : これはブロックではありません。この値は現在の仕様では使用できません。そのような値が存在する場合、破損したデータとみなされ、仕様に準拠するデコーダはそれを拒否する必要があります。
3.1.1.2.3. Block_Size (ブロックサイズ)
Block_Header の上位 21 ビットは Block_Size を表します。
Block_Type が Compressed_Block または Raw_Block の場合、Block_Size は Block_Content のサイズです (したがって Block_Header は含まれません)。
Block_Type が RLE_Block の場合、Block_Content のサイズは常に 1 であるため、Block_Size はこのバイトを繰り返す必要がある回数を表します。
Block_Size は Block_Maximum_Size によって制限されます (以下を参照)。
3.1.1.2.4. Block_Content and Block_Maximum_Size (ブロックコンテンツとブロック最大サイズ)
Block_Content のサイズは Block_Maximum_Size によって制限されます。これは次の 2 つのうち小さい方です:
- Window_Size
- 128 KB
Block_Maximum_Size は特定のフレームに対して一定です。この最大値は、フレーム内の任意のブロックの解凍サイズと圧縮サイズの両方に適用されます。
この制限の理論的根拠は、デコーダがフレームの開始時にこの情報を読み取り、それを使用してバッファを割り当てることができることです。ブロックサイズの保証により、バッファが有効なフレームの後続のブロックに対して十分であることが保証されます。
圧縮ブロックが圧縮されていないブロックよりも大きい場合は、代わりに圧縮されていないブロック (つまり Raw_Block) を送信することをお勧めします。