跳到主要内容

6. 块切换命令的编码 (Encoding of Block-Switch Commands)

6. 块切换命令的编码 (Encoding of Block-Switch Commands)

如 Section 2 所述, block-switch command 是一个 <block type, block count> 对. 它们编码在 meta-block 的 compressed data part 中, 位于某个特定 block category 的每个新 block 开始之前.

compressed data 中的每个 block type 都用一个 block type code 表示, 该 code 使用 block type code alphabet 上的 prefix code 编码. block type symbol 0 表示新的 block type 与同一 block category 中前一个 block 的类型相同, 即当前类型之前的那个 block type; block type symbol 1 表示新的 block type 等于当前 block type 加一. 如果当前 block type 是可能的最大值, 则 block type symbol 1 会回绕到新的 block type 0. block type symbol 2..257 分别表示 block type 0..255. previous block type 和 current block type 在 meta-block header 结束处分别初始化为 1 和 0.

由于每个 block category 的第一个 block type 为 0, 第一个 block-switch command 的 block type 不编码在 compressed data 中. 如果某个 block category 只有一个 block type, 则第一个 block-switch command 的 block count 也会从 compressed data 中省略; 否则, 它编码在 meta-block header 中.

由于 meta-block 的结束通过已生成的未压缩字节数检测, 三个类别中任何一个类别的 block count 在 meta-block 结束处都不必恰好倒数到零.

每个 block category 中不同 block type 的数量, 对 literal, insert-and-copy length 和 distance 分别记为 NBLTYPESL, NBLTYPESI 和 NBLTYPESD, 编码在 meta-block header 中, 并且必须等于该 block category 中最大 block type 加一. 换言之, literal, insert-and-copy length 和 distance block type 的集合必须分别为 [0..NBLTYPESL-1], [0..NBLTYPESI-1] 和 [0..NBLTYPESD-1]. 由此可知, literal, insert-and-copy length 和 distance block type code 的 alphabet size 分别为 NBLTYPESL + 2, NBLTYPESI + 2 和 NBLTYPESD + 2.

compressed data 中的每个 block count 都用一个 <block count code, extra bits> 对表示. block count code 和 extra bits 前后相接编码. block count code 使用 block count code alphabet 上的 prefix code 编码, 而 extra bits 值编码为固定宽度整数值. extra bits 的数量可以为 0..24, 且取决于 block count code.

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

        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

每个 block category 的第一个 block-switch command 是特殊的, 因为它编码在 meta-block header 中. 如前所述, block type code 会被省略, 因为它是隐式零.


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