阅读与阅读在Qt中解释二进制文件

时间:2014-05-11 23:33:19

标签: c++ qt hex qbytearray

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

以下是我的代码段:

  1. 阅读文件:

    QFile file(iFile);
    if (!file.open(QIODevice::ReadOnly)) return;
    QByteArray iContents = file.readAll();
    
  2. 获取长度

    ushort  c3 = 0xFF;
    c3 = iContents.at(2); // c3 should be "BE" hex.
    printf ( "%0x %d\n", c3, c3 );
    
  3. 输出是:

    FFFFFFBE -66

    如何将其读为190?

    我在搜索后尝试过各种各样的东西,但似乎没有什么工作可以说明我在代码中遗漏了一些基本内容。

    进行转换的当前代码是:decimal

1 个答案:

答案 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)强制转换具有最高优先级,并且按位运算符的操作数被提升为整数(这就是移位结果不为零的原因)。