尝试在Qt中读取二进制文件。
该文件包含混合文本和二进制(十六进制)数据。
该文件包含长度由十六进制数指定的数据区域。
例如:
00 01 BE 00 00 00 00 00 00 00 00 00 01
在这里" BE"在文件的偏移量BB处。 BE是190,所以我向前滚动到上面的最后一个字节,我知道接下来的190个字节是我的数据。
我已经挣扎了几天试图让我的Qt代码转换字节值" BE"如上所述,数字为190.
我得到的最好的是" -66",当然是190-256。
另一个例子是:
00 01 D3 63 00 00 00 00 00 00 00 01
应转换为" 63D3"这是十进制的25555。
以下是我的代码段:
阅读文件:
QFile file(iFile);
if (!file.open(QIODevice::ReadOnly)) return;
QByteArray iContents = file.readAll();
获取长度
ushort c3 = 0xFF;
c3 = iContents.at(2); // c3 should be "BE" hex.
printf ( "%0x %d\n", c3, c3 );
输出是:
FFFFFFBE -66
如何将其读为190?
我在搜索后尝试过各种各样的东西,但似乎没有什么工作可以说明我在代码中遗漏了一些基本内容。
进行转换的当前代码是:decimal
答案 0 :(得分:1)
QByteArray::at()
会返回(已签名)char
并将其分配给unsigned short
。您希望将值0xbe视为无符号,因此您应该将其强制转换为:
c3 = (unsigned char) iContents.at(2);
对于2个字节的小端整数(我假设它只是D363
你感兴趣并且零在这里没有意义?):
unsigned short i = (unsigned char) iContent.at(2) | (unsigned char) iContent.at(3) << 8;
(unsigned char)
强制转换具有最高优先级,并且按位运算符的操作数被提升为整数(这就是移位结果不为零的原因)。