剩余长度 - 简介
- 位置:固定报头中,从第2个字节开始。
- 剩余长度等于可变报头的长度(10字节)加上有效载荷的长度。
- 剩余长度(Remaining Length)表示当前报文剩余部分的字节数,包括可变报头和负载的数据。
- 剩余长度不包括用于编码剩余长度字段本身的字节数。
剩余长度字段 的帧格式:
帧格式 - 剩余长度字段
第1个字节 |
第2个字节 |
... |
Bit 7 |
Bit 6:0 |
Bit 7 |
Bit 6:0 |
... |
进位标志位 |
长度低字节 |
进位标志位 |
长度高字节 |
... |
-
剩余长度字段 的字节长度:最少1个字节,最多4个字节。
-
剩余长度字段 可以表示的长度:1个字节时,可以表示剩余 0~127 长度。4个字节时,最大表示长度为 2^(7*4) - 1 = 2^28 - 1 = 268435455 长度
剩余长度字段 表示的字节长度
字节数 |
表示长度的最小值(字节) |
表示长度的最大值(字节) |
1 |
0 |
2^7 - 1 = 127 |
2 |
2^7 = 128 |
2^(7*2) - 1 = 16383 |
3 |
2^(7*2) = 16384 |
2^(7*3) - 1 = 2097151 |
4 |
2^(7*3) = 2097152 |
2^(7*4) - 1 = 268435455 |
之所以1个字节不能表示 2^8 - 1 = 255长度,是因为:每个字节的最高位 Bit7,并不表示数据,是进位标志位。
剩余长度 - 计算
假设本帧剩余字节为 200,计算剩余长度字段。
- 使用电脑计算器,将 200 转换为二进制 1100 1000(MSB高位在前)
- 从右侧低位每7Bit进行一次拆分,依次拆分出:
- 第1个字节为 100 1000,有进位,高位加上进位1为 1100 1000 = 0xC8 (16进制)。
- 第2个字节为 1,无进位,为 1 = 0x01 (16进制)。
那么对应的 字节长度的帧格式如下表:
|
第1个字节 |
第2个字节 |
|
Bit 7 |
Bit 6:0 |
Bit 7 |
Bit 6:0 |
|
进位标志位 |
|
进位标志位 |
|
2进制 |
1 |
100 1000 |
0 |
000 0001 |
2进制 |
1100 1000 |
0000 0001 |
16进制 |
0xC8 |
0x01 |
假设本帧剩余字节为 1000,计算剩余长度字段。
- 使用电脑计算器,将 1000 转换为二进制 11 1110 1000(MSB高位在前)
- 从右侧低位每7Bit进行一次拆分,依次拆分出:
- 第1个字节为 110 1000,有进位,高位加上进位1为 1110 1000 = 0xE8 (16进制)。
- 第2个字节为 11 1,无进位,为 11 1 = 0x07 (16进制)。
那么对应的 字节长度的帧格式如下表:
|
第1个字节 |
第2个字节 |
|
Bit 7 |
Bit 6:0 |
Bit 7 |
Bit 6:0 |
|
进位标志位 |
|
进位标志位 |
|
2进制 |
1 |
110 1000 |
0 |
000 0111 |
2进制 |
1110 1000 |
0000 0111 |
16进制 |
0xE8 |
0x07 |
假设本帧剩余字节为 100,000,000,计算剩余长度字段。
- 使用电脑计算器,将 100,000,000 转换为二进制 101 1111 0101 1110 0001 0000 0000(MSB高位在前)
- 从右侧低位每7Bit进行一次拆分,依次拆分出:
- 第1个字节为 000 0000,有进位,高位加上进位1为 1000 0000 = 0x80 (16进制)。
- 第2个字节为 10 0001 0,有进位,高位加上进位1为 1100 0010 = 0xC2 (16进制)。
- 第3个字节为 1 0101 11,有进位,高位加上进位1为 1101 0111 = 0xD7 (16进制)。
- 第4个字节为 101 111 = 00,无进位,为 10 1111 = 0x2F (16进制)。
那么对应的 字节长度的帧格式如下表:
|
第1个字节 |
第2个字节 |
第3个字节 |
第4个字节 |
|
Bit 7 |
Bit 6:0 |
Bit 7 |
Bit 6:0 |
Bit 7 |
Bit 6:0 |
Bit 7 |
Bit 6:0 |
|
进位标志位 |
|
进位标志位 |
|
进位标志位 |
|
进位标志位 |
|
2进制 |
1 |
000 0000 |
1 |
100 0010 |
1 |
101 0111 |
0 |
010 1111 |
2进制 |
1000 0000 |
1100 0010 |
1101 0111 |
0010 1111 |
16进制 |
0x80 |
0xC2 |
0xD7 |
0x2F |