Qt quint32 Little-Endianness with QDataStream

Qt quint32 Little-Endianness with QDataStream

本文关键字:QDataStream with Little-Endianness quint32 Qt      更新时间:2023-10-16

我使用QDatastream在Little-Endian ARM机器上从QByteArray填充一个quint32数组,如下所示:

    // Modify the header
    QByteArray header = QByteArray::fromRawData((const char*)dataPtr,HEADER_SIZE);
    QDataStream dataStream(header);
    dataStream.setByteOrder(QDataStream::LittleEndian);
    quint32 headerBuffer[NUMBER_HEADER_ENTRIES];
    int bufferCnt = 0;
    while ( !dataStream.atEnd() ) {
        // Pop off a 32 bit int
        quint32 temp;
        dataStream >> temp;
        // insert into buffer
        headerBuffer[bufferCnt] = temp;
        // Increment counter
        bufferCnt++;
    }

问题在于字节顺序。我需要在headerBuffer[113]中抓取32位字段的最后4位,所以我试图用0xf和headerBuffer中的条目。根据该字段进行检查的期望值是"3"。然而,这个AND运算给了我"a",如下图所示。如果我交换字节,使条目为"0x1a13 &0x000f",然后得到"3"。您可以在下面看到其他一些期望值的例子,而不是我所看到的。因此,我将QDataStream的ByteOrder设置为LittleEndian,但仍然没有得到所需的结果。我做错了什么?我怎么能得到0x1a13而不是0x131a?谢谢!

        qDebug() << "ONE: " << QString("%1").arg(headerBuffer[0], 0, 16); // This prints: 494d0152 -- Should be: 4d495201
        qDebug() << "TWO: " << QString("%1").arg(headerBuffer[1], 0, 16); // This prints: 5400 -- Should be: 54
        qDebug() << "THREE: " << QString("%1").arg(headerBuffer[113] & 0x000f, 0, 16); // This prints: a -- Should be: 3 ( headerBuffer[113] is always 0x131a )
        qDebug() << "FOUR: " << QString("%1").arg(0x1a13 & 0x000f, 0, 16); // This prints: 3 -- Should be: 3

看起来字节顺序在字节数组中有点不寻常。也就是说,它是由大端序的单词组成的,但词序是低端序的。

如果您以LE形式获得494d0152,则数组中的字节序列为:

52 01 4d 49

当你期待4d 49 52 01时,很明显,"低"字是4d 49,是按BE顺序排列的。高字也一样。

所以你可以试着修改你的代码:

QDataStream dataStream(header);
dataStream.setByteOrder(QDataStream::BigEndian);
...
quint16 low, high;
quint32 temp;
dataStream >> low >> high;
temp = (high << 32) | low;