今天早晨在填充协议头是使用了如下代码:
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换成0x71或0x60时数据能正确显示。经比较好现原来
0xeb,或0x90都是超过了127的数。而0x71与0x60都是没有超过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的时候会出现越界的情况。也可以通过已上两种方式来解决。
转载于:https://blog.51cto.com/langtuteng/1373864