如何在数据流中找出需要的包

 假设定义好了数据包: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;
        }
    }
posted @ 2018-01-30 14:17  朱小勇  阅读(460)  评论(0编辑  收藏  举报