zoukankan      html  css  js  c++  java
  • 如何在数据流中找出需要的包

     假设定义好了数据包:FE(开始符)+FF(报文长度)+AA(标志位)+BB(数据)+CC(校验位)+FF(结束符)

    原理:找到每个FE,判断这个FE后面的报文长度、校验、结束符是否正确,如果正确就把这个包提取出来

    Qt代码:

       uchar ba_1_lenth=0;
        int position_FE=0;
        while(true)
        {
            position_FE = ba.indexOf(0xFE,position_FE);//找到第一个FE的位置
            if(-1==position_FE)//如果没有找到则返回
            {
                break;
            }
            if(ba.size()==(position_FE+1))//防止下面“at(position_FE+1)”越界
            {
                break;
            }
            if((uchar)ba.at(position_FE+1)>(ba.size()-position_FE))//如果报文中的帧长度大于实际接收长度,说明长度不够或者此FE不是开始符
            {
                position_FE++;//返回找判断下一个FE
                continue;
            }
            /*如果长度足够*/
            ba_1_lenth = (uchar)ba.at(position_FE+1);
            if(0xFF==(uchar)ba.at(position_FE+ba_1_lenth-1))//结束符为0xFF
            {
                if((uint16_t)MyMethod::my_crc((uchar*)ba.data()+position_FE,ba_1_lenth-3) == uint16_t(((uchar)ba.at(position_FE+ba_1_lenth-3)<<8)+(uchar)ba.at(position_FE+ba_1_lenth-2)))//CRC正确
                {
                    QByteArray ba2;
                    ba2 = ba.mid(position_FE,ba_1_lenth);
                    ba = ba.remove(0,position_FE+ba_1_lenth);
                    this->doAnalysis2(ba2);
                }
                else//CRC错误
                {
                    position_FE++;//返回找判断下一个FE
                    continue;
                }
            }
            else//结束符不是FF
            {
                position_FE++;//返回找判断下一个FE
                continue;
            }
        }
  • 相关阅读:
    1052 卖个萌
    编程实现hdfs对文件的操作
    关于Eclipse编译运行MapReduce程序报错问题的解决
    用户模板和用户场景
    用户体验评价
    大二下学期软件工程课程总结
    教师派第二阶段10
    教师派第二阶段09
    教师派第二阶段07
    教师派第二阶段06
  • 原文地址:https://www.cnblogs.com/judes/p/8384776.html
Copyright © 2011-2022 走看看