当前位置:   article > 正文

字节流数据解析_tcp字节流数据解析

tcp字节流数据解析

一,前言

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

二,解决思路

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

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

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

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

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

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

流程图如下:

三,演示代码

  1. void UnPacket(const char *pBuf, short len)
  2. {
  3. if((null == pBuf) || 0 == len)
  4. return;
  5. for(int i = 0; i < len; i++)
  6. {
  7. if((0xCC == pBuf[i]) && (0xAA == pBuf[i +1]))//找到帧头
  8. {
  9. if(i + 2 >= len)
  10. return;
  11. int packetLen = pBuf[i + 2]//帧长
  12. if(i + packetLen < len)//判断完整数据
  13. {
  14. //计算检验位,比较检验值
  15. //移除buf中对应字节流
  16. }
  17. }
  18. }

四,后记

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/293929
推荐阅读
相关标签
  

闽ICP备14008679号