5. Primitive Type 表示 (Primitive Type Representations)
HPACK 编码使用两种 primitive types: 无符号可变长度整数和 octets 字符串.
5.1. Integer Representation
整数用于表示名称索引, header field 索引, 或字符串长度. integer representation 可以从 octet 内的任何位置开始. 为了允许优化处理, integer representation 始终在 octet 末尾结束.
整数用两部分表示: 填充当前 octet 的 prefix, 以及一个可选的 octets 列表. 如果整数值无法放入 prefix, 就使用该 octets 列表. prefix 的比特数 (称为 N) 是 integer representation 的一个参数.
如果整数值足够小, 即严格小于 2^N-1, 则它会被编码在 N-bit prefix 内.
0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+
| ? | ? | ? | Value |
+---+---+---+-------------------+
Figure 2: Integer Value Encoded within the Prefix (Shown for N = 5)
否则, prefix 的所有比特都被设置为 1, 并将该值减去 2^N-1 后, 使用一个或多个 octets 的列表进行编码. 每个 octet 的最高有效位用作 continuation flag: 除列表中最后一个 octet 外, 其值都设置为 1. 这些 octets 中剩余的比特用于编码减小后的值.
0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+
| ? | ? | ? | 1 1 1 1 1 |
+---+---+---+-------------------+
| 1 | Value-(2^N-1) LSB |
+---+---------------------------+
...
+---+---------------------------+
| 0 | Value-(2^N-1) MSB |
+---+---------------------------+
Figure 3: Integer Value Encoded after the Prefix (Shown for N = 5)
从 octets 列表解码整数值时, 首先反转列表中 octets 的顺序. 然后, 对每个 octet 移除其最高有效位. 将这些 octets 中剩余的比特拼接起来, 并将得到的值加上 2^N-1, 即得到整数值.
prefix 大小 N 始终在 1 到 8 bits 之间. 从 octet 边界开始的整数将具有 8-bit prefix.
表示整数 I 的伪代码:
if I < 2^N - 1, encode I on N bits
else
encode (2^N - 1) on N bits
I = I - (2^N - 1)
while I >= 128
encode (I % 128 + 128) on 8 bits
I = I / 128
encode I on 8 bits
解码整数 I 的伪代码:
decode I from the next N bits
if I < 2^N - 1, return I
else
M = 0
repeat
B = next octet
I = I + (B & 127) * 2^M
M = M + 7
while B & 128 == 128
return I
Appendix C.1 中提供了说明整数编码的示例.
这种 integer representation 允许表示大小不确定的值. 编码器也可能发送大量零值, 这会浪费 octets, 并且可能用于使整数值溢出. 超出实现限制的整数编码, 无论是数值还是 octet 长度超出限制, 都 MUST 被视为解码错误. 可以根据实现约束, 为整数的不同用途设置不同限制.
5.2. String Literal Representation
header field 名称和 header field 值可以表示为 string literals. string literal 被编码为一个 octets 序列, 方式可以是直接编码该 string literal 的 octets, 也可以是使用 Huffman code (见 [HUFFMAN]).
0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+
| H | String Length (7+) |
+---+---------------------------+
| String Data (Length octets) |
+-------------------------------+
Figure 4: String Literal Representation
string literal representation 包含以下字段:
H: 一个 1-bit 标志 H, 指示字符串的 octets 是否经过 Huffman coding.
String Length: 用于编码 string literal 的 octets 数量, 它编码为带有 7-bit prefix 的整数 (见 Section 5.1).
String Data: string literal 的已编码数据. 如果 H 为 '0', 则已编码数据是该 string literal 的原始 octets. 如果 H 为 '1', 则已编码数据是该 string literal 的 Huffman encoding.
使用 Huffman encoding 的 string literals 使用 Appendix B 中定义的 Huffman code 进行编码.