MQTT 固定报头 中 剩余长度字段的计算

 

剩余长度 - 简介

  • 位置:固定报头中,从第2个字节开始
  • 剩余长度等于可变报头的长度(10字节)加上有效载荷的长度
  • 剩余长度(Remaining Length)表示当前报文剩余部分的字节数,包括可变报头和负载的数据
  • 剩余长度不包括用于编码剩余长度字段本身的字节数。

 

剩余长度字段 的帧格式:

 

帧格式 - 剩余长度字段
第1个字节第2个字节...
Bit 7Bit 6:0Bit 7Bit 6:0...
进位标志位长度低字节进位标志位长度高字节...
  • 剩余长度字段 的字节长度:最少1个字节,最多4个字节。
  • 剩余长度字段 可以表示的长度:1个字节时,可以表示剩余 0~127 长度。4个字节时,最大表示长度为 2^(7*4) - 1 = 2^28 - 1 = 268435455 长度

 

剩余长度字段 表示的字节长度
字节数表示长度的最小值(字节)表示长度的最大值(字节)
102^7 - 1 = 127
22^7 = 1282^(7*2) - 1 = 16383
32^(7*2) = 163842^(7*3) - 1 = 2097151
42^(7*3) = 20971522^(7*4) - 1 = 268435455

 

  • 提示

之所以1个字节不能表示 2^8 - 1 = 255长度,是因为:每个字节的最高位 Bit7,并不表示数据,是进位标志位

 

 

剩余长度 - 计算

  • 示例1

假设本帧剩余字节为 200,计算剩余长度字段。

  1. 使用电脑计算器,将 200 转换为二进制 1100 1000(MSB高位在前)
  2. 从右侧低位每7Bit进行一次拆分,依次拆分出:
  3. 第1个字节为 100 1000,有进位,高位加上进位1为 1100 1000 = 0xC8 (16进制)。
  4. 第2个字节为 1,无进位,为 1 = 0x01 (16进制)。

那么对应的 字节长度的帧格式如下表:

 第1个字节第2个字节
 Bit 7Bit 6:0Bit 7Bit 6:0
 进位标志位 进位标志位 
2进制1100 10000000 0001
2进制1100 10000000 0001
16进制0xC80x01

 

  • 示例2

假设本帧剩余字节为 1000,计算剩余长度字段。

  1. 使用电脑计算器,将 1000 转换为二进制 11 1110 1000(MSB高位在前)
  2. 从右侧低位每7Bit进行一次拆分,依次拆分出:
  3. 第1个字节为 110 1000,有进位,高位加上进位1为 1110 1000 = 0xE8 (16进制)。
  4. 第2个字节为 11 1,无进位,为 11 1 = 0x07 (16进制)。

那么对应的 字节长度的帧格式如下表:

 第1个字节第2个字节
 Bit 7Bit 6:0Bit 7Bit 6:0
 进位标志位 进位标志位 
2进制1110 10000000 0111
2进制1110 10000000 0111
16进制0xE80x07

 

  • 示例3

假设本帧剩余字节为 100,000,000,计算剩余长度字段。

  1. 使用电脑计算器,将 100,000,000 转换为二进制 101 1111 0101 1110 0001 0000 0000(MSB高位在前)
  2. 从右侧低位每7Bit进行一次拆分,依次拆分出:
  3. 第1个字节为 000 0000,有进位,高位加上进位1为 1000 0000 = 0x80 (16进制)。
  4. 第2个字节为 10 0001 0,有进位,高位加上进位1为 1100 0010 = 0xC2 (16进制)。
  5. 第3个字节为 1 0101 11,有进位,高位加上进位1为 1101 0111 = 0xD7 (16进制)。
  6. 第4个字节为 101 111 = 00,无进位,为 10 1111 = 0x2F (16进制)。

那么对应的 字节长度的帧格式如下表:

 第1个字节第2个字节第3个字节第4个字节
 Bit 7Bit 6:0Bit 7Bit 6:0Bit 7Bit 6:0Bit 7Bit 6:0
 进位标志位 进位标志位 进位标志位 进位标志位 
2进制1000 00001100 00101101 01110010 1111
2进制1000 00001100 00101101 01110010 1111
16进制0x800xC20xD70x2F
  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值