Я использую QDatastream для заполнения массива quint32 из QByteArray на машине ARM Little-Endian, как показано ниже:
// 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++;
}
Проблема с порядком байтов. Мне нужно получить последние 4 бита 32-битного поля в headerBuffer [113], поэтому я попытался добавить эту запись в headerBuffer с 0xf. Ожидаемое значение для проверки по этому полю — «3». Однако эта операция И дает мне «а», как показано ниже. Если я поменяю местами байты так, чтобы запись была «0x1a13 & 0x000f «, тогда я получаю» 3 «. Вы можете увидеть ниже несколько других примеров ожидаемых значений в сравнении с тем, что я вижу. Итак, я устанавливаю ByteOrder QDataStream в 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
Похоже, порядок байтов немного необычен в вашем байтовом массиве. То есть он упакован в словах с прямым порядком байтов, но с низким порядком слов.
Если вы получаете 494d0152
в форме LE последовательность байтов в массиве:
52 01 4d 49
Когда вы ожидаете 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;
Других решений пока нет …