MQTT协议-CONNECT报文剩余长度计算

MQTT协议-CONNECT报文剩余长度计算

参考:https://www.bilibili.com/video/BV1qa411d7DW?p=54

剩余长度(Remaining Length)表示当前报文剩余部分的字节数,包括可变报头和负载的数据。剩余长度不包括用于编码剩余长度字段本身的字节数。

剩余长度

官方说明:表示当前报文剩余部分的字节数,包括可变报头和负载的数据。

简单理解为将固定报头、可变报头和有效负载的所有字节组合在一起后,从表示剩余长度的字节位置开始往后数,数到结尾,一共有多少个字节,则剩余长度就是多少。例如上篇文章计算了112个字节,转为十六进制就是0x70。

MQTT协议-CONNECT报文剩余长度计算_第1张图片

但真正剩余长度计算有一个标准的编码方案,规则如下:

1、剩余长度字段使用一个变长度编码方案,对小于128的值它使用单字节编码。
2、低7位有效位用于编码数据,最高有效位用于指示是否有更多的字节。剩余长度字段最大4个字节。

计算过程

低7位有效位用于编码数据,最高有效位用于指示是否有更多的字节

解释:一个字节8位,从第0位到第6位用来表示真实的长度数据,比如后面还有10个字节,就为a;因为数据位只有7位,全部为1的情况下最大可表示的值为127,即后续字节数量小于128个的话,可以使用一个字节来表示完,大于等于128个的话,一个字节就表示不了,最高位表示该字节后是否还有字节来表示长度,为0,则后面没有再表示长度的字节,说明字节数量小于128个,为1,表示后面还有字节来一起表示长度,说明字节数量大于等于128个

MQTT协议-CONNECT报文剩余长度计算_第2张图片

字节数量为112个的话,可先转为二进制,因为小于128,所以第7位为0,再转为十六进制为0x70,所以报文的剩余长度位置可以只填70

MQTT协议-CONNECT报文剩余长度计算_第3张图片

如果字节数量为300,则大于128,无法只用一个字节来表示,需要用到两个字节,规定低字节在前,高字节在后

高8位的1表示的数值为128,根据公式300=128*a+b,计算出a和b的值,a是高8位的,b是低8位的

MQTT协议-CONNECT报文剩余长度计算_第4张图片

计算可得a=2,b=44,将b转为二进制放到低8位,第7位填入1,表示后面还有一个字节表示长度,再将a转为二进制放到高8位,第7位填入0,表示后续没有字节表示长度,因此转为十六进制后为AC 02,报文的剩余长度位置需要填AC 02

MQTT协议-CONNECT报文剩余长度计算_第5张图片

当报文中出现十六进制的剩余长度时,需要懂得逆推出十进制的

1、先将AC的二进制写出来,发现最高位为1,因此后面还有一个字节表示长度

2、把02的二进制写出来,AC为低8位,02为高8位

3、将AC二进制的的最高位变为0,因为该位只起指示作用,不是真正的数值,然后转为十六进制是2C

4、将2C和02都转为十进制,分别为44和2,根据公式计算出十进制的剩余长度

MQTT协议-CONNECT报文剩余长度计算_第6张图片

剩余长度范围

MQTT协议-CONNECT报文剩余长度计算_第7张图片

不同字节数所能表示的剩余长度最大最小值

MQTT协议-CONNECT报文剩余长度计算_第8张图片

计算更多的字节长度

MQTT协议-CONNECT报文剩余长度计算_第9张图片

MQTT协议-CONNECT报文剩余长度计算_第10张图片

你可能感兴趣的:(MQTT,阿里云,物联网,MQTT协议)