MQTT剩余长度字段的编码方案是一种变长度的编码方案,主要用于表示当前报文剩余部分的字节数,包括可变报头和负载的数据,但不包括用于编码剩余长度字段本身的字节数。该编码方案的具体特点如下:
1. 字节数与范围
- 最少占用1个字节:当剩余长度小于或等于127时。
- 最多占用4个字节:当剩余长度非常大时,最多需要4个字节来表示。
不同字节数对应的剩余长度范围如下:
字节数 | 剩余长度范围(十进制) | 剩余长度范围(十六进制) |
---|---|---|
1 | 0 - 127 | 0x00 - 0x7F |
2 | 128 - 16,383 | 0x80,0x01 - 0xFF,0x7F |
3 | 16,384 - 2,097,151 | 0x80,0x80,0x01 - 0xFF,0xFF,0x7F |
4 | 2,097,152 - 268,435,455 | 0x80,0x80,0x80,0x01 - 0xFF,0xFF,0xFF,0x7F |
2. 编码规则
- 低7位有效位:每个字节的低7位(Bit0 ~ Bit6)用于编码数据,表示实际的剩余长度值的一部分。
- 最高有效位(Bit7):用作延续位(continuation bit),当Bit7为1时,表示后面还有更多的字节来表示剩余长度;当Bit7为0时,表示剩余长度的编码到此结束。
3. 编码示例
-
剩余长度100:
- 100/128=0,无需进位,Bit7为0。
- 100%128=100,即Bit0~Bit6为0x64。
- 因此,剩余长度编码为1个字节,即0x64。
-
剩余长度1000:
- 1000/128=7,需要进位,Bit7为1。
- 7/128=0,无需再进位,但前面已有进位,所以总体需要2个字节。
- 1000%128=104,即第一个字节的Bit0Bit6为0x68;7%128=7,即第二个字节的Bit0Bit6为0x07。
- 因此,剩余长度编码为2个字节,即0xE8 0x07(注意,0xE8的Bit7为1,表示有进位)。
4. 解码算法
解码时,从第一个字节开始,不断读取并累加每个字节的低7位表示的数值,同时检查最高位(Bit7)是否为1。如果Bit7为1,则继续读取下一个字节;如果Bit7为0,则解码结束。
5. 总结
MQTT剩余长度字段的编码方案通过变长度的字节序列来表示可能的很大范围的剩余长度值,最高可达268,435,455字节(即256MB),这种设计使得MQTT协议能够高效地处理不同大小的报文。同时,该编码方案也考虑了编码后的数据紧凑性,减少了传输过程中的数据冗余。