我已经在一些低级消息上苦苦挣扎了很长时间,事实证明这是校验和计算的问题。我认为按位XOR运算符不在乎符号,因此我使用QByteArray
存储字节,并使用at
方法返回char
来计算字节。校验和。有时(但并非总是)正确地确认了消息。
好像另一端的人正在使用uint8_t
存储字节,并且
在某些情况下,校验和失败。我通过将char
强制转换为uint8_t
来解决它,但是对此我感到很困惑。
为什么按位XOR运算符关心符号?我认为它在某种程度上起作用,无论它们代表什么。这是我用来尝试理解的一段代码。
#include <stdio.h>
#include <stdint.h>
#include <iostream>
#include <bitset>
int main ()
{
uint8_t a = 0b10010101;
char b = 0b10010101;
uint32_t checksum;
checksum = 55;
checksum ^= a;
std::cout << std::bitset<32>(checksum) << std::endl;
checksum = 55;
checksum ^= b;
std::cout << std::bitset<32>(checksum) << std::endl;
}
即使两个整数都持有相同的位,在每种情况下,该运算也会得出不同的结果。
答案 0 :(得分:9)
首先,您必须记住,char
是有符号的还是无符号的,都是实现定义的。
然后,您必须记住,在表达式中使用较小类型的值(如char
或uint8_t
时,其值是promoted至int
(或可能是unsigned int
) 。此促销带有已签名类型的符号扩展。
因此,如果对char
进行了签名,则值0b10010101
将被提升为0b11111111111111111111111110010101
(使用two's complement表示负数)。 非常与无符号值0b00000000000000000000000010010101
不同。