今天早晨在填充协议头是使用了如下代码:

QByteArraytempArray;


tempArray.push_back((unsignedchar)0xeb);

tempArray.push_back((unsignedchar)0x90);

tempArray.push_back((unsignedchar)0xeb);

tempArray.push_back((unsignedchar)0x90);

tempArray.push_back((unsignedchar)0xeb);

tempArray.push_back((unsignedchar)0x90);


然后想将其在控制台输出,来显示该帧是否正确填充,却看到本应输出0xeb的地方却输出了0xffffffeb。这个问题困扰了我几个小时,还以为是填进去的数据在QT里什么机制下变成了错误数据。后来发现将eb或者90换成0x710x60时数据能正确显示。经比较好现原来

0xeb,0x90都是超过了127的数。而0x710x60都是没有超过127的数。也就是说我填进去的本应是无符号的数。而QByteArray将其原样填进去后,在输出时其前面是一个1,所以将它之前的数也输出来了,有点类型于TCP粘包的样子,所以前面带了ffffff

将输出代码改为:

for (inti = 0; i <data.length();i++)

{

printf("%4x",data.at(i)&0xff);

}


就能正常显示0xeb了。


还有另外一种比较简单的方法,那就是在大于127的前面加上unsigned char 对其进行转化,这样子也可以正常显示0xeb.

总结,对有符号数来说最高位为0表示正数,最就位为1表示负数。而对无符号数来说就没有符号位与非符号位了。QByteArray在输出其一位数时如果不加上0xff,其结果就有可以数组越界。


这个问题在网络编程中如果不注意也会影响一个程序的流程,比如在做协义配对的时候,如果接到的数据大于0x7f的时候会出现越界的情况。也可以通过已上两种方式来解决。