整形包传输

struct{

int head;

int data;

int crc;

int tail;

}

包以字符串接口传输

普通情况下很多包传输接口支持byte buffer传输,比如socket read write,file接口等,但是c++的一些库也存在使用string 作为传输接口;在这个接口下传输整形数据包会有风险,就是用string data = &packet构造字符串会有数据丢失的情况。因为'\0'会提前终止数据包。

解决办法有2个:

方法1.std::string 使用append(int ,const char)函数,比如s.append(1,(char)  *( (char*)&packet+index ) );

方法2. 先将packet的每个字节的直接映射成字符串 ,比如将packet.head(值为0x55aa    十进制为85/170)直接映射成"55aa" packet.data(值为0)直接映射成"0";再传输这个包的时候这些可见字符串不可能为0,也就不会丢失数据。映射规则:可见的数字转ascci码

但是解码的时候,如果是10进制数据可视化转ascii码就会出现问题,就是几个字符是一个解码单位,85 170可以是8 5 170 也可以是85 1 70 ,8 5 1 7 0等情况,就会出现混乱。我们知道1byte取值范围为0-255,也就是说一个字节可以用1 2 3 个字符来解码;可以采取前面填充0的方案保持每个字节有三个字符的方案来解决。但是这样可能会有比较多的无用数据(前面填充的0);另外的思路就是转成16进制的字符串,每个字节由2个字符表示,同样高位补零,但是明显无用数据少了。解析的时候每两个字节解析为一个byte就ok了

posted @ 2023-04-27 17:45  晚秋深林  阅读(16)  评论(0)    收藏  举报