跳到主要内容

5. 字面量插入长度和复制长度的编码 (Encoding of Literal Insertion Lengths and Copy Lengths)

5. 字面量插入长度和复制长度的编码 (Encoding of Literal Insertion Lengths and Copy Lengths)

如 Section 2 所述, 字面量插入长度 (literal insertion length) 和向后复制长度 (backward copy length) 使用单一 prefix code 编码. 本节提供这种编码的细节.

compressed data part 中的每个 <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 前后相接编码. insert-and-copy length code 使用 insert-and-copy length code alphabet 上的 prefix code 编码, 而 extra bits 值编码为固定宽度整数值. insert extra bits 和 copy extra bits 的数量可以为 0..24, 且取决于 insert-and-copy length code.

某些 insert-and-copy length code 还表示同一命令中 distance 的 distance symbol 为 0, 即该命令的 distance 分量与上一条命令相同. 在这种情况下, compressed data stream 中会省略 distance 的 distance code 和 extra bits.

我们按照 (不直接使用的) insert length code 和 copy length code alphabet 来描述 insert-and-copy length code alphabet. insert length code alphabet 的符号, insert extra bits 的数量以及 insert length 的范围如下:

        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

copy length code alphabet 的符号, copy extra bits 的数量以及 copy length 的范围如下:

        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-and-copy length code 转换为 insert length code 和 copy length code:

       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 |
| | | |
+----------+----------+----------+

首先, 查找包含该 insert-and-copy length code 的 64 值范围的单元格; 该单元格给出 insert length code 和 copy length code 的范围, 两个范围都长 8 个值. 在其范围内的 copy length code 由 insert-and-copy length code 的 bit 0..2 (从 lsb 开始计数) 决定. 在其范围内的 insert length code 由 insert-and-copy length code 的 bit 3..5 (从 lsb 开始计数) 决定. 给定 insert length code 和 copy length code 后, 可通过读取上表给出的 extra bits 数量来获得实际 insert length 和 copy length.

如果 insert-and-copy length code 介于 0 和 127 之间, 则该命令的 distance code 设置为零 (重用 last distance).


Source: RFC 7932 Official Text: https://www.rfc-editor.org/rfc/rfc7932.txt