在Qt中读取和解释二进制文件

Reading & Interpreting Binary file in Qt

本文关键字:解释 二进制文件 读取 Qt      更新时间:2023-10-16

尝试在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 %dn", c3, c3 );
    

输出为:

FFFFFFBE -66

怎么把它读成190?

我在搜索后尝试了各种各样的东西,但似乎没有任何工作,这表明我在我的代码中缺少一些基本的东西。

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

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