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

2023-11-14

 

剩余长度 - 简介

  • 位置:固定报头中,从第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,并不表示数据,是进位标志位

 

 

剩余长度 - 计算

  • 示例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 7 Bit 6:0 Bit 7 Bit 6:0
  进位标志位   进位标志位  
2进制 1 100 1000 0 000 0001
2进制 1100 1000 0000 0001
16进制 0xC8 0x01

 

  • 示例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 7 Bit 6:0 Bit 7 Bit 6:0
  进位标志位   进位标志位  
2进制 1 110 1000 0 000 0111
2进制 1110 1000 0000 0111
16进制 0xE8 0x07

 

  • 示例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 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MQTT 固定报头 中 剩余长度字段的计算 的相关文章

随机推荐

  • 5分钟讲解直流线性稳压降压电源基本原理

    怎么把 12 v电变为 5v呢 通过变压器是可以实现的 但是变压器只能转换交流电 那直流电怎么转换呢 我们来看下最简单的降压方式 比如负载是 5欧 那么要得到 5V的压降 按照串联分压原理 需要给它串联一个 7 欧的电阻附加 就能得到 5
  • 【LINUX相关】生成随机数(srand、/dev/random 和 /dev/urandom )

    目录 一 问题背景 二 修改方法 2 1 修改种子 2 2 使用linux中的 dev urandom 生成随机数 三 dev random 和 dev urandom 的原理 3 1 参考连接 3 2 重难点总结 3 2 1 生成随机数的
  • 9*9乘法表

    package practice 99乘法表 public class Test02 public static void main String args for int i 1 i lt 9 i 外层控制行数 for int j 1 j
  • 【查缺补漏】“.“ 和 “->“运算符的区别是什么?

    目录 简介 Note 结语 简介 Hello 非常感谢您阅读海轰的文章 倘若文中有错误的地方 欢迎您指出 昵称 海轰 标签 程序猿 C 选手 学生 简介 因C语言结识编程 随后转入计算机专业 获得过国家奖学金 有幸在竞赛中拿过一些国奖 省奖
  • shell test功能

    test测试功能 对于要测试系统上面某些文件或其相关属性时 可以使用test进行测试 test会根据相关功能返回True或False 测试文件类型test e filename 测试功能 意义 e 该文件是否存在 f 该文件名是否存在且为文
  • SSD1306 - OLED显示屏

    SSD1306 OLED显示屏 芯片介绍 引脚介绍 SSD1306是一款带控制器的用于OLED点阵图形显示系统的单片CMOS OLED PLED驱动器 它由128个SEG 列输出 和64个COM 行输出 组成 该芯片专为共阴极OLED面板设
  • 数据的无量纲化处理和标准化处理的区别是什么

    数据的无量纲化处理和标准化处理的区别是什么 请教 两者除了方法上有所不同外 在其他方面还有什么区别 解答 标准化处理方法是无量纲化处理的一种方法 除此之外 还有相对化处理方法 包括初值比处理 函数化 功效系数 方法 等等 由于标准化处理方法
  • C++11智能指针之unique_ptr

    1 智能指针概念 智能指针是基于RAII机制实现的类 模板 具有指针的行为 重载了operator 与operator gt 操作符 可以 智能 地销毁其所指对象 C 11中有unique ptr shared ptr与weak ptr等智
  • 英语 动词过去式和过去分词的变化规则

    动词过去式和过去分词有规则变化和不规则变化两种 实例顺序 动词原形过去式过去分词 发音 ed在清辅音音素后发音为 t 在浊辅音后发音为 d 在元音后发音也为 d 在 t d 后发音为 id 一 规则变化 1 一般在动词原形后加 ed loo
  • 嵌套查询及其与join的区别

    嵌套即可以写在select子句中 也可以写在from子句中 下面以SQL Entity为例来说明 1 嵌套在select中 以父表为主在select中嵌套子表信息 SELECT c Title ANYELEMENT SELECT oa Fi
  • mysql联合索引最左匹配原则的底层实现原理

    mysql联合索引最左匹配原则的底层实现原理 要看懂 需要熟悉mysql b tree的数据结构 b tree的叶节点和叶子节点的排序特性是按照 从小到大 从左到右的这么一个规则 int直接比大小 uuid比较ASCII码 联合索引的排序规
  • 极简式 Unity 获取 bilibili 直播弹幕、SC、上舰、礼物等 插件

    极简式 Unity 获取 bilibili 直播弹幕 SC 上舰 礼物等 1 声明 下载链接 软件均仅用于学习交流 请勿用于任何商业用途 2 介绍 该项目为Unity实时爬取B站直播弹幕 项目介绍 通过传入B站直播间账号 实现监控B站直播弹
  • java threadlocal 详解_Java中的ThreadLocal深入理解详解

    提到 ThreadLocal是什么 ThreadLocal是一个关于创建线程局部变量的类 通常情况下 我们创建的变量是可以被任何一个线程访问并修改的 而使用ThreadLocal创建的变量只能被当前线程访问 其他线程则无法访问和修改 Glo
  • sha256的python实现

    在 Python 中可以使用 hashlib 库来实现 SHA 256 哈希算法 代码如下 import hashlib defsha256 data sha256 hashlib sha256 sha256 update data enc
  • 为什么printf只能用_cdecl调用约定

    1 什么是调用约定 调用约定 Calling conventions 和type representations 名称修饰 name mangling 同是应用二进制接口 application binary interface ABI 概
  • 分析rocketmq-client产生大量rocketmq_client.log日志文件的原因处理方案

    源码 public static final String CLIENT LOG USESLF4J rocketmq client logUseSlf4j public static final String CLIENT LOG ROOT
  • 05 两层神经网络 - 神经网络和深度学习 [Deep Learning Specialization系列]

    本文是Deep Learning Specialization系列课程的第1课 Neural Networks and Deep Learning 中Shallow Neural Network部分的学习笔记 在前面的章节中 我们以逻辑回归
  • Yolov5改进之更改损失函数(EIOU、SIOU)

    目录 1 修改metrics py文件 2 修改loss py函数 1 修改metrics py文件 找到bbox iou代码段 def bbox iou box1 box2 xywh True GIoU False DIoU False
  • 测试用例----测试大纲法

    一 应用场合 在一个程序中涉及多个窗口 每个窗口有多个操作 窗口和窗口之间有一定的联系 或者说操作之间的联系 为了弄清它们之间的联系 使用测试大纲法 二 使用测试大纲法分析程序 1 列大纲 提纲 分析需求 列出所有的窗口以及每个窗口包含的操
  • MQTT 固定报头 中 剩余长度字段的计算

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