最近在编写公司的珞石机器人底层代码,在通信解包的时候遇到一些问题.
首先是关于机器人发送的数据
由于机器人底层并没有C++高级,传输数据时候,有时会不得已传入奇奇怪怪的东西
//for: <<Titanite控制系统操作手册>>
byte 表示 RL 语言中的无符号字节,相当于 C++中的 unsigned char。取值范围 0~255,不允许为负值
所以我为了传输IO控制信号不得选择了byte数组
//for: rokae.sendtask
GLOBAL PERS byte byte_IO[30] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
在Qt中TCP通信接收数据为QByteArray格式,使用QDebug打印得到如下数据:
"\x01\x02\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01";
通过转换为Qstring类型的数据打印得到
"\u0001\u0002\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"
查阅资料得到
1.\x和\u两个都是十六进制数,只是编码格式不同,一个为ascll编码,另一个为Unicode编码
2.通过arr.at()和arr[ ]能直接访问数组的数据.且通过arr.size()得到以下数据,证明成功:
qDebug() << arr2.size();
//输出为:30
注:qDebug打印会自带 " ",如果想取消" "请加上noquote( )方法:
qDebug().noquote() << msg2;
但是经过测试,qDebug.noquote() 好像不能直接打印\x01或者\u0001,并且
QByteArray arr2 = "\x01\x02\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01";
qDebug() << arr2.at(1);
也会无法输出,但是可以通过以下方法判断
if (arr2[1] == '\x02')
{
qDebug() << arr2.size() ;
}
以上