首页 论坛 物联网专区 MQTT一段代码求解

正在查看 1 帖子:1-1 (共 1 个帖子)
  • 参与人数:1 |  围观次数:54 
  • zhouzibin
    zhouzibin 瓜农

    // 计算接收到的网络数据中,报文的实际长度(通过【剩余长度】得到)
    //===============================================================================================
    int ICACHE_FLASH_ATTR mqtt_get_total_length(uint8_t* buffer, uint16_t length)
    {
    int i;
    int totlen = 0; // 报文总长度(字节数)

    // 计算剩余长度的值
    //——————————————————————–
    for(i = 1; i <length; ++i) // 解析【剩余长度】字段(从buffer[1]开始)
    {
    totlen += (buffer[i]&0x7f)<<(7*(i-1));

    // 如果剩余长度的当前字节的值<0x80,则表示此字节是最后的字节
    //———————————————————————–
    if((buffer[i]&0x80) == 0) // 当前字节的值<0x80
    {
    ++i; // i == 固定报头长度 == 报文类型(1字节) + 剩余长度字段

    break; // 跳出循环
    }
    }

    totlen += i; // 报文总长度 = 固定报头长度 + 剩余长度的值(【可变报头】+【有效载荷】的长度)

    return totlen; // 返回报文总长度
    }

     

    问题:

    totlen += (buffer[i]&0x7f)<<(7*(i-1));

    为什么左移是7的倍数而不是8的倍数。如果7*2的话,那就变成左移14位了,虽然最高位是标志位,但是如果移动14位的话,等于少了两位了。

正在查看 1 帖子:1-1 (共 1 个帖子)

抱歉,回复话题必需登录。