我正在使用 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] 中 32bit 字段的最后 4 位,所以我尝试将 headerBuffer 中的条目与 0xf 进行 AND。检查此字段的预期值为“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

最佳答案

看起来字节数组中的字节顺序有点不寻常。 IE。它包含在大端词中,但具有低端词序。

如果您以 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;

关于c++ - Qt quint32 Little-Endianness with QDataStream,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15486487/

10-11 23:16