3

QDatastreamを使用して、以下のようなリトルエンディアン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ビットを取得する必要があるため、headerBufferのそのエントリを0xfとAND演算しようとしました。このフィールドに対してチェックする期待値は「3」です。ただし、このAND演算では、以下に示すように「a」が返されます。エントリが「0x1a13&0x000f」になるようにバイトを交換すると、「3」になります。私が見ているものと比較して、期待される値の他のいくつかの例を以下に見ることができます。そのため、QDataStreamのByteOrderをLitt​​leEndianに設定していますが、それでも目的の結果が得られません。私は何が間違っているのですか?0x131aの代わりに0x1a13を取得するにはどうすればよいですか?ありがとう!

        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
4

1 に答える 1

6

バイト配列では、バイト順序が少し変わっているように見えます。つまり、ビッグエンディアンの単語が詰め込まれていますが、ローエンディアンの語順があります。

LE形式で取得494d0152している場合、配列のバイトシーケンスは次のとおりです。

52 01 4d 49

あなたが4d 49 52 01それを明確に期待しているとき、「低い」単語が4d 49BEの順序にある​​ことは明らかです。ハイワードについても同じです。

したがって、コードを変更しようとする可能性があります。

QDataStream dataStream(header);
dataStream.setByteOrder(QDataStream::BigEndian);
...
quint16 low, high;
quint32 temp;
dataStream >> low >> high;
temp = (high << 32) | low;
于 2013-03-18T21:15:48.570 に答える