Конвертировать QByteArray в unsigned short: не так, как ожидалось - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть QByteArray, как это:

QByteArray idx0;

// idx0 is then assigned 4 bytes,
// idx0 content is shown on debugger as:

// idx0 "\000\000\001\000"  QByteArray
//          '\0'    0       0x00    char
//          '\0'    0       0x00    char
//                  1       0x01    char
//          '\0'    0       0x00    char

Я конвертирую QbyteArray в unsigned short следующим образом:

unsigned short ushortIdx0;
if ( idx0.size() >= sizeof(ushortIdx0) ) {
    ushortIdx0 = *reinterpret_cast<const unsigned short *>( idx0.data() );
}

Отладчик показывает значение ushortIdx0 как 0:

// Debugger shows:
//
// ushortIdx0   0   unsigned short

Однако , когда я конвертирую значение Little Endian 0x 00 00 01 00 в UINT32 - Little Endian на на этом сайте , я получаю:

UINT32 - Little Endian (DCBA):

Raw             UINT32
00 01 00 00     65536

Почему результат этого сайта отличается от того, что я получаю по своему коду? Я не понимаю Я ценю любую помощь.

1 Ответ

0 голосов
/ 01 сентября 2018

Согласно комментарию вы не всегда можете предположить, что unsigned short - это определенный размер. Если вы знаете, что вам нужно целое число без знака с определенным числом битов, используйте соответствующий тип из cstdint - uint32_t в этом случае.

Что касается проблем с порядком байтов, поскольку вы используете Qt, почему бы не использовать QDataStream для сериализации / десериализации данных без учета платформы. Напишите 32-разрядное целое число без знака, используя ...

quint32 data = ...;
QByteArray ba;
QDataStream ds(&ba, QIODevice::ReadWrite);
ds << data;

И аналогично, чтобы прочитать данные обратно.

...