Qt quint32使用QDataStream进行Little-Endianness

Phi*_*Bot 3 c++ qt endianness qbytearray

我正在使用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++;

    }
Run Code Online (Sandbox Code Playgroud)

问题在于字节顺序.我需要在headerBuffer [113]中获取32位字段的最后4位,所以我尝试用headerf在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
Run Code Online (Sandbox Code Playgroud)

Val*_*ouk 6

看起来字节顺序在字节数组中有点不寻常.也就是说它是用big-endian词组装的,但是用低端词序排列.

如果您494d0152使用LE格式,则数组中的字节序列为:

52 01 4d 49
Run Code Online (Sandbox Code Playgroud)

当你期待4d 49 52 01它清楚时,'低'字4d 49是按顺序排列的.同样的高词.

所以你可能会尝试修改你的代码:

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