赞
踩
在实际开发中,数据通常以字节流形式传输,比如网络编程开发中,TCP传输无边界字节流,嵌入式开发中,串口通讯也是,数据收发也是以字节流形式。如下图所示,通过网络调试助手,网络服务端,收到十六进制格式字节流数据,需要解析字节流数据。
如何解析字节流数据?字节流数据是按一定格式打包。打包格式可以简化为,数据帧头 + 数据长度 + 数据类型+数据+校验位。如下:
数据帧 | 帧长 | 包类型 | 数据段 | 检验位 | |
所占字节数 | 2 | 2 | 2 | X | 2 |
数据帧头:可以定义为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中对应字节流
- }
- }
- }
字节流解析,是开发中经常碰到问题。有的格式定义更加复杂,比如有的数据包中有多段数据,解析更加麻烦。但基本原理都是这样。实现代码有很多优化空间。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。