1

试图在 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

应转换为 25555 十进制的“63D3”。

这是我的代码片段:

  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 );
    

输出是:

FFFFFFBE -66

我如何才能将其读取为 190?

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

当前进行转换的代码是:十进制

4

1 回答 1

1

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

于 2014-05-12T01:04:51.013 回答