Qt QByteArray无符号类型问题:RS232发送超128整数输出异常
问题分析与解决方案:QByteArray处理大于128的字节时的数值异常
这个问题我太熟悉了,本质就是有符号char的符号扩展在搞鬼!
咱们一步步拆解:
- 你定义的
uc_array[1]是0xAA(十进制170),这是一个无符号字节值; - 但QByteArray的
operator[]返回的是char类型——而绝大多数编译器里char是有符号类型,取值范围是-128到127; 0xAA作为有符号char来看,二进制最高位是1,代表负数,转成十进制就是-86(补码规则);- 当你把这个有符号的
char(-86)强制转换为uint时,会触发符号扩展:把符号位(最高位的1)填充到32位uint的所有高位,最终得到0xFFFFFFAA,转成十进制就是4294967210——这就是你看到的奇怪输出。
解决办法有这几种,随便选一种都能解决:
取出值时先转成unsigned char再转uint
这样能截断符号扩展的影响,直接拿到原始的无符号字节值:cout << (uint)(unsigned char)qb_array[1] << endl; // 输出170直接访问QByteArray的底层无符号数据
用constData()拿到底层指针,转成uchar*后再访问:cout << (uint)((const uchar*)qb_array.constData())[1] << endl; // 输出170构建QByteArray时就明确无符号语义
如果是从无符号数组初始化,可以直接用构造函数指定数据和长度:uchar uc_array[]={0x41,0xAA}; QByteArray qb_array((const char*)uc_array, sizeof(uc_array)); // 之后取值时还是要注意转unsigned char,避免符号问题
核心要记住:QByteArray底层存储的是char类型,当处理大于127的字节值时,一定要留意有符号/无符号的转换陷阱,别让符号扩展打乱你的预期数值。
内容的提问来源于stack exchange,提问作者Antonio Del Sannio
相关产品推荐
相关产品推荐

