QDataStream и QByteArray с помощью ByteOrder - PullRequest
0 голосов
/ 30 марта 2020

Недавно я встретил вопрос, когда хочу заполнить тип QByteArray с помощью QDataStream. QDataStream может установить Byteorder.

uint16_t data[2] = {10, 20};
QByteArray array;
QDataStream in(&array, QIODevice::ReadWrite);
in.setVersion(QDataStream::Qt_5_7);
in.setByteOrder(QDataStream::BigEndian);
in.writeRawData((char*)data, 4);
qDebug()<<(int)array[0]<<(int)array[1]<<(int)array[2]<<(int)array[3];

Этот код выводится ниже:

10 0 20 0

Если я изменю ByteOrder с BigEndian на LittleEndian, вывод будет таким же. Почему я меняю ByteOrder и получаю тот же результат? Как мне кажется, вывод должен выглядеть следующим образом:

0 10 0 20

Если я хочу получить обратный результат, как мне поступить?

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

writeRawData - это не то, что вы ищете, а просто добавляет данные в буфер как есть. Порядковый номер зависит от типа, но writeRawData принимает параметр как char*, поэтому он ничего не знает о типе, который вы хотите сериализовать.

Возможная реализация приведена ниже. Печатает буфер в шестнадцатеричном представлении.

#include <QDebug>
#include <QDataStream>
#include <QByteArray>

int main()
{
    QByteArray buffer;
    QDataStream ss { &buffer , QIODevice::ReadWrite };

    uint16_t data[2] = {10, 20};
    QByteArray array_be;
    QDataStream in_be(&array_be, QIODevice::ReadWrite);
    in_be.setVersion(QDataStream::Qt_5_7);
    in_be.setByteOrder(QDataStream::BigEndian);

    in_be << data[ 0 ] << data [ 1 ];

    qDebug() << "BE :" << array_be.toHex( ' ' );

    QByteArray array_le;
    QDataStream in_le(&array_le, QIODevice::ReadWrite);
    in_le.setVersion(QDataStream::Qt_5_7);
    in_le.setByteOrder(QDataStream::LittleEndian);

    in_le << data[ 0 ] << data [ 1 ];

    qDebug() << "LE :" << array_le.toHex( ' ' );
}
0 голосов
/ 30 марта 2020

Когда вы используете

in.writeRawData((char*)data, 4);

, вы пишете 4 char объектов. Результат этой операции не меняется независимо от того, какую последовательность вы используете. Вместо этого используйте

in << data[0] << data[1]

.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...