尝试在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?
搜索后我尝试了各种方法,但似乎没有任何效果,这表明我的代码中缺少一些基本的知识。
当前进行转换的代码是:十进制
最佳答案
QByteArray::at()
返回(签名的)char
,然后将其分配给unsigned short
。您希望将值0xbe视为无符号,因此应将其强制转换为:c3 = (unsigned char) iContents.at(2);
对于2个字节的little-endian整数(我假设它只是您感兴趣的D363
,而零在这里毫无意义?):unsigned short i = (unsigned char) iContent.at(2) | (unsigned char) iContent.at(3) << 8;
(unsigned char)
强制转换具有最高优先级,按位运算符的操作数被提升为整数(这就是移位结果不为零的原因)。
关于c++ - 在Qt中读取和解释二进制文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23599038/