尝试在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/

    10-13 08:27
    查看更多