5. リテラル挿入長とコピー長のエンコーディング (Encoding of Literal Insertion Lengths and Copy Lengths)
5. リテラル挿入長とコピー長のエンコーディング (Encoding of Literal Insertion Lengths and Copy Lengths)
セクション 2 で説明したように、リテラル挿入長 (Literal Insertion Lengths) と後方コピー長 (Backward Copy Lengths) は、単一のプレフィックスコードを使用してエンコードされます。このセクションでは、このエンコーディングの詳細を提供します。
メタブロックの圧縮データ部分の各 <insertion length, copy length> ペアは、次のトリプレットで表されます:
<insert-and-copy length code, insert extra bits, copy extra bits>
挿入およびコピー長コード (Insert-and-Copy Length Code)、挿入追加ビット (Insert Extra Bits)、およびコピー追加ビット (Copy Extra Bits) は連続してエンコードされ、挿入およびコピー長コードは挿入およびコピー長コードアルファベット上のプレフィックスコードを使用してエンコードされ、追加ビット値は固定幅整数値としてエンコードされます。挿入とコピーの追加ビットの数は 0..24 であり、挿入およびコピー長コードに依存します。
一部の挿入およびコピー長コードは、同じコマンド内の距離の距離シンボルが 0 であること、つまり、コマンドの距離コンポーネントが前のコマンドの距離コンポーネントと同じであることも表現します。この場合、距離の距離コードと追加ビットは圧縮データストリームから省略されます。
挿入およびコピー長コードアルファベットを、(直接使用されない)挿入長コード (Insert Length Code) とコピー長コード (Copy Length Code) アルファベットの観点から説明します。挿入長コードアルファベットのシンボル、挿入追加ビットの数、および挿入長の範囲は次のとおりです:
Extra Extra Extra
Code Bits Lengths Code Bits Lengths Code Bits Lengths
---- ---- ------- ---- ---- ------- ---- ---- -------
0 0 0 8 2 10..13 16 6 130..193
1 0 1 9 2 14..17 17 7 194..321
2 0 2 10 3 18..25 18 8 322..577
3 0 3 11 3 26..33 19 9 578..1089
4 0 4 12 4 34..49 20 10 1090..2113
5 0 5 13 4 50..65 21 12 2114..6209
6 1 6,7 14 5 66..97 22 14 6210..22593
7 1 8,9 15 5 98..129 23 24 22594..16799809
コピー長コードアルファベットのシンボル、コピー追加ビットの数、およびコピー長の範囲は次のとおりです:
Extra Extra Extra
Code Bits Lengths Code Bits Lengths Code Bits Lengths
---- ---- ------- ---- ---- ------- ---- ---- -------
0 0 2 8 1 10,11 16 5 70..101
1 0 3 9 1 12,13 17 5 102..133
2 0 4 10 2 14..17 18 6 134..197
3 0 5 11 2 18..21 19 7 198..325
4 0 6 12 3 22..29 20 8 326..581
5 0 7 13 3 30..37 21 9 582..1093
6 0 8 14 4 38..53 22 10 1094..2117
7 0 9 15 4 54..69 23 24 2118..16779333
挿入およびコピー長コードを挿入長コードとコピー長コードに変換するには、次の表を使用できます:
Insert
length Copy length code
code 0..7 8..15 16..23
+----------+----------+
| | |
0..7 | 0..63 | 64..127 | <--- distance symbol 0
| | |
+----------+----------+----------+
| | | |
0..7 | 128..191 | 192..255 | 384..447 |
| | | |
+----------+----------+----------+
| | | |
8..15 | 256..319 | 320..383 | 512..575 |
| | | |
+----------+----------+----------+
| | | |
16..23 | 448..511 | 576..639 | 640..703 |
| | | |
+----------+----------+----------+
まず、挿入およびコピー長コードを含む 64 値範囲のセルを検索します。これにより、挿入長コードとコピー長コードの範囲が得られ、両方とも 8 値の長さです。その範囲内のコピー長コードは、挿入およびコピー長コードのビット 0..2(lsb からカウント)によって決定されます。その範囲内の挿入長コードは、挿入およびコピー長コードのビット 3..5(lsb からカウント)によって決定されます。挿入長コードとコピー長コードが与えられると、実際の挿入長とコピー長は、上記の表で指定された追加ビット数を読み取ることで取得できます。
挿入およびコピー長コードが 0 から 127 の間にある場合、コマンドの距離コードはゼロに設定されます(最後の距離が再利用されます)。
出典 (Source): RFC 7932, Section 5
公式テキスト (Official Text): https://www.rfc-editor.org/rfc/rfc7932.txt