6. ブロック切り替えコマンドのエンコーディング (Encoding of Block-Switch Commands)
6. ブロック切り替えコマンドのエンコーディング (Encoding of Block-Switch Commands)
セクション 2 で説明したように、ブロック切り替えコマンド (Block-Switch Command) はペア <block type, block count> です。これらは、メタブロックの圧縮データ部分で、特定のブロックカテゴリの各新しいブロックの開始直前にエンコードされます。
圧縮データ内の各ブロックタイプ (Block Type) は、ブロックタイプコード (Block Type Code) で表され、ブロックタイプコードアルファベット上のプレフィックスコードを使用してエンコードされます。ブロックタイプシンボル 0 は、新しいブロックタイプが同じブロックカテゴリの前のブロックのタイプと同じであることを意味します。つまり、現在のタイプの前にあったブロックタイプであり、ブロックタイプシンボル 1 は、新しいブロックタイプが現在のブロックタイプに 1 を加えたものに等しいことを意味します。現在のブロックタイプが最大可能値である場合、ブロックタイプシンボル 1 は新しいブロックタイプ 0 へのラップをもたらします。ブロックタイプシンボル 2..257 は、それぞれブロックタイプ 0..255 を表します。前のブロックタイプと現在のブロックタイプは、メタブロックヘッダーの終わりでそれぞれ 1 と 0 に初期化されます。
各ブロックカテゴリの最初のブロックタイプは 0 であるため、最初のブロック切り替えコマンドのブロックタイプは圧縮データにエンコードされません。ブロックカテゴリがブロックタイプを 1 つだけ持つ場合、最初のブロック切り替えコマンドのブロックカウント (Block Count) も圧縮データから省略されます。それ以外の場合は、メタブロックヘッダーにエンコードされます。
メタブロックの終わりは生成された非圧縮バイト数によって検出されるため、3 つのカテゴリのいずれかのブロックカウントは、メタブロックの終わりで正確にゼロにカウントダウンする必要はありません。
各ブロックカテゴリの異なるブロックタイプの数は、リテラル、挿入およびコピー長、および距離に対してそれぞれ NBLTYPESL、NBLTYPESI、および NBLTYPESD で示され、メタブロックヘッダーにエンコードされます。これは、そのブロックカテゴリの最大ブロックタイプに 1 を加えたものに等しくなければなりません。言い換えれば、リテラル、挿入およびコピー長、および距離ブロックタイプのセットは、それぞれ [0..NBLTYPESL-1]、[0..NBLTYPESI-1]、および [0..NBLTYPESD-1] でなければなりません。これから、リテラル、挿入およびコピー長、および距離ブロックタイプコードのアルファベットサイズは、それぞれ NBLTYPESL + 2、NBLTYPESI + 2、および NBLTYPESD + 2 であることがわかります。
圧縮データ内の各ブロックカウントは、ペア <block count code, extra bits> で表されます。ブロックカウントコード (Block Count Code) と追加ビット (Extra Bits) は連続してエンコードされ、ブロックカウントコードはブロックカウントコードアルファベット上のプレフィックスコードを使用してエンコードされ、追加ビット値は固定幅整数値としてエンコードされます。追加ビットの数は 0..24 であり、ブロックカウントコードに依存します。
ブロックカウントコードアルファベットのシンボル、追加ビットの数、およびブロックカウントの範囲は次のとおりです:
Extra Extra Extra
Code Bits Lengths Code Bits Lengths Code Bits Lengths
---- ---- ------- ---- ---- ------- ---- ---- -------
0 2 1..4 9 4 65..80 18 7 369..496
1 2 5..8 10 4 81..96 19 8 497..752
2 2 9..12 11 4 97..112 20 9 753..1264
3 2 13..16 12 5 113..144 21 10 1265..2288
4 3 17..24 13 5 145..176 22 11 2289..4336
5 3 25..32 14 5 177..208 23 12 4337..8432
6 3 33..40 15 5 209..240 24 13 8433..16624
7 3 41..48 16 6 241..304 25 24 16625..16793840
8 4 49..64 17 6 305..368
各ブロックカテゴリの最初のブロック切り替えコマンドは、メタブロックヘッダーにエンコードされるという点で特別であり、前述のように、ブロックタイプコードは暗黙のゼロであるため省略されます。
出典 (Source): RFC 7932, Section 6
公式テキスト (Official Text): https://www.rfc-editor.org/rfc/rfc7932.txt