MQTT剩余长度计算

1 剩余长度占用(1~4)个字节

剩余长度就是指后面跟了多少字节。
剩余长度一字节只用bit0~bit6这7位表示数据,用bit7表示进位标志,为1则说明有进位,为0则无进位。
1字节可表示的数据:0~127个字节=128个
2 7 − 1 = 127 2^7-1=127 271=127
4字节可表示的数据:0~268435455个字节=256*1024*1024=256M
2 28 − 1 = 268435455 2^{28}-1=268435455 2281=268435455

2 剩余长度计算方法

bit7bit6bit5bit4bit3bit2bit1bit0
进位标志数据数据数据数据数据数据数据

假设剩余长度为500,转换为十六进制显示就是0X1F4,转换为二进制显示就是0001 1111 0100。
先看前7位 (111 0100),因为前7位才是有效数据!
给bit7的进位标志置1:(表示产生进位了)

进位标志bit6bit5bit4bit3bit2bit1bit0
1(有进位)1110100

所以剩余长度第一个字节就是0XF4(1111 0100)。(500%128)|(0X80) = 116 | 0X80 = 0XF4
再看剩下的:

bit14bit13bit12bit11bit10bit9bit8bit7
00000011

所以剩余长度第二个字节就是0X03。(500/128=3) = 0X03
用数组remainBytes来存就是:

int ramainBytes[2] = {0XF4, 0X03};
// 利用上面两个数据怎么算出剩余长度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剩余长度计算

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GentleTK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值