将二进制流通过QDataStream::readRawData读入到一个char*缓冲区,再从缓冲区逐个字节取出数据(0~255的整数):
uint value = (uint)buf[i];
信手拈来写的一句导致万劫不复。。。
由于char是有符号类型,强转为无符号类型uint会导致128~255的数据发生溢出,因为有符号到无符号实际上是取模运算,uint取模是加上2^32,所以异常数据都会很大
memory | char | uint |
---|---|---|
0x80 ~ 0xFF | -128 ~ -1 | 4294967168 ~ 4294967295 (0xFFFFFFFFFFFFFF80 ~ 0xFFFFFFFFFFFFFFFFF) |
例如,127强转后是127, 128则是4294967168
正确做法:
uchar value = (uchar)buf[i];
memory | char | uchar |
---|---|---|
0x80 ~ 0xFF | -128 ~ -1 | 128 ~ 255 |