MQTT剩余长度计算
1 剩余长度占用(1~4)个字节
剩余长度就是指后面跟了多少字节。
剩余长度一字节只用bit0~bit6
这7位表示数据,用bit7
表示进位标志,为1
则说明有进位,为0
则无进位。
1字节可表示的数据:0~127个字节=128个
$$
2^7-1=127
$$
4字节可表示的数据:0~268435455个字节=256*1024*1024=256M
$$
2^{28}-1=268435455
$$
2 剩余长度计算方法
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|
进位标志 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 |
假设剩余长度为500,转换为十六进制显示就是0X1F4,转换为二进制显示就是0001 1111 0100。
先看前7位 (111 0100),因为前7位才是有效数据!
给bit7的进位标志置1:(表示产生进位了)
进位标志 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|
1(有进位) | 1 | 1 | 1 | 0 | 1 | 0 | 0 |
所以剩余长度第一个字节就是0XF4(1111 0100)。(500%128)|(0X80) = 116 | 0X80 = 0XF4
再看剩下的:
bit14 | bit13 | bit12 | bit11 | bit10 | bit9 | bit8 | bit7 |
---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
所以剩余长度第一个字节就是0X03。(500/128=3) = 0X03
用数组remainBytes来存就是:
int ramainBytes[2] = {0XF4, 0X01}; // 利用上面两个数据怎么算出剩余长度500? // 0XF4 = 1111 0100 // 1.先把有进位的标志给去掉 // 1111 0100 --> 0111 0100 = 0X74 = 116 // 2.计算剩余长度 // 0X03 = 3 // remainLength = 3 * 128 + 116 = 384 + 116 = 500
3 剩余长度计算函数
/************************************************** * 功能: mqtt 协议层获取剩余长度占用字节数 * 参数: len:剩余内容长度 * buf:剩余内容指针 * 返回: 剩余长度占用字节数 * 备注:无 * ************************************************/ static int32 MQTT_GetRemainBytes(uint32 len, uint8* buf) { uint32 bytes = 0; // 假设len = 500 for (bytes = 1; bytes <= 4; bytes++) { // 1. *buf = len % 128 = 116 // 2. len = len / 128 = 500 / 128 = 3 // 4. *buf = len % 128 = 3 % 128 = 3 = 0X03 // 5. buf[0] = 0XF4, buf[1] = 0X03 *buf = len % 128; len /= 128; // 剩余长度超过 1 字节, bit 置 1 // 3.len > 3, *buf = *buf | 0X80 = 116 | 0X80 = 0XF4 if (len > 0) { *buf |= 0X80; buf++; } else { return bytes; } } return -1; }
文章作者:GentleTK
原文链接:https://gentletk.gitee.io/MQTT剩余长度计算
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决