字节流数据解析

一,前言

      在实际开发中,数据通常以字节流形式传输,比如网络编程开发中,TCP传输无边界字节流,嵌入式开发中,串口通讯也是,数据收发也是以字节流形式。如下图所示,通过网络调试助手,网络服务端,收到十六进制格式字节流数据,需要解析字节流数据。

二,解决思路

        如何解析字节流数据?字节流数据是按一定格式打包。打包格式可以简化为,数据帧头 + 数据长度 + 数据类型+数据+校验位。如下:

数据帧帧长包类型数据段检验位
所占字节数222X2

          数据帧头:可以定义为0xCCAA, 注意数据帧头的定义,应该避开数据段可能数据,数据段误解析成帧头。

           帧长:一个完整数据包长度。

            数据段所占的长度:包长度减除固定字段长度,即为X。

        一个完整得数据包,接收端可能分多次接收到。接收端需要定义缓冲buf,将每次到数据放到buf中,然后遍历缓冲buf数据,首先找到数据帧头,根据帧长,判断缓冲buf是否有足够长度。如果有,则是一个完整的包,然后计算数据校验值。和检验位数据比较。如果相等,则是正确的包,反之是错误的包。不管完整包是正确还是错误,都需要把对应字节流从缓冲buf移除。

流程图如下:

三,演示代码

void UnPacket(const char *pBuf, short len)
{
    if((null == pBuf) || 0 == len)
     return;

    for(int i = 0; i < len; i++)
    {
        if((0xCC == pBuf[i]) && (0xAA == pBuf[i +1]))//找到帧头
        {
            if(i + 2 >= len)
                return;

            int packetLen = pBuf[i + 2]//帧长

            if(i + packetLen <  len)//判断完整数据
            {
	            //计算检验位,比较检验值
                //移除buf中对应字节流
           }
        }
    }

四,后记

   字节流解析,是开发中经常碰到问题。有的格式定义更加复杂,比如有的数据包中有多段数据,解析更加麻烦。但基本原理都是这样。实现代码有很多优化空间。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值