​ 最近在编写公司的珞石机器人底层代码,在通信解包的时候遇到一些问题.

首先是关于机器人发送的数据

由于机器人底层并没有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() ;
	}

以上