跳到主要内容

16. 可变长度整数编码

16. 可变长度整数编码

QUIC packet 和 frame 通常对非负整数值使用可变长度编码 (varint). 这种编码确保较小的整数值需要更少的字节来编码.

QUIC varint 编码保留第一个字节中最高有效的两位, 用于编码整数编码长度 (以字节为单位) 的以 2 为底的对数. 整数值以网络字节序编码在其余位中.

这意味着整数会被编码为 1, 2, 4, 或 8 字节, 并且可分别编码 6, 14, 30, 或 62 位的值. 表 4 汇总了编码属性.

2BitLengthUsable BitsRange
00160-63
012140-16383
104300-1073741823
118620-4611686018427387903

表 4: 整数编码摘要

例如, 八字节序列 0xc2 0x19 0x7c 0x5e 0xff 0x14 0xe8 0x8c (十六进制) 解码为十进制值 151288809941952652; 四字节序列 0x9d 0x7f 0x3e 0x7d 解码为 494878333; 两字节序列 0x7b 0xbd 解码为 15293; 单字节 0x25 解码为 37 (双字节序列 0x40 0x25 也解码为 37).

值不需要使用必要的最少字节数进行编码.

endpoint MAY 使用比严格必要更多的字节来编码某个值. 例如, 可以使用两字节编码来编码小于 64 的值.

Version (第 15 节), header 中发送的 packet number (第 17.1 节), 以及 frame type (第 19 节) 都使用整数描述, 但不使用此编码.