Преобразование QByteArray из прямого порядка байтов в обратный порядок байтов

Думаю, я здесь как бы в растерянности. Я пробую такую ​​простую вещь, я не могу поверить, что нет ничего встроенного в Qt (используя Qt 5.6.2). Я пытаюсь преобразовать данные внутри QByteArray из прямого порядка байтов в обратный порядок байтов. Всегда начинается с одного и того же теста QByteArray, вот так.

QByteArray value;
value.append(0x01);
value.append(0x02);
value.append(0x03);
qDebug() << "Original value is: " << value.toHex(); // “010203” like expected

Мне нужен прямой порядок байтов, что означает, что результат должен быть «030201». Есть ли что-то встроенное в Qt Framework? Я не нахожу ни одного. Что я пробовал до сих пор

// Try with build in QtEndian stuff
QByteArray test = qToLittleEndian(value);
qDebug() << "Test value is: " << test.toHex(); // 010203

// Try via QDataStream
QByteArray data;
QDataStream out(&data, QIODevice::ReadWrite);
out.setByteOrder(QDataStream::LittleEndian);
out << value;
qDebug() << "Changed value is: " << data.toHex(); // "03000000010203"

Есть хорошая идея? Или мне действительно нужно менять руки вручную? Не нашел ничего полезного в SO или в Google, или, может быть, задаете неправильный вопрос ...


person sandkasten    schedule 09.05.2018    source источник
comment
Одиночный байт означает то же самое в прямом и обратном порядке. Представляют ли эти байты какой-то другой тип данных?   -  person bnaecker    schedule 09.05.2018
comment
Хм .. может я на ложном пути? Мне нужна еще функция реверса? Эти байты поступают непосредственно из измерительного блока, который отправляет данные в виде байтов в кодировке с прямым порядком байтов. Данные представляют собой совокупность различных значений, поставленных вместе. Итак, сначала мне нужно исправить данные, над которыми я работал.   -  person sandkasten    schedule 09.05.2018
comment
Какой именно тип данных вам отправляет единица измерения? char, uint16_t, double и т. Д.   -  person bnaecker    schedule 09.05.2018
comment
Как я имел в виду bevore, это составное значение, которое необходимо интерпретировать путем декодирования QByteArray. Но это сделано позже. Во-первых, мне нужно изменить порядок. Не зацикливайтесь на типе данных. Как написано в вопросе, мне просто нужен еще один QByteArray в «правильном» порядке.   -  person sandkasten    schedule 09.05.2018
comment
Концепция порядка байтов применима только к многобайтовым типам данных. Таким образом, правильный порядок зависит от типа данных. Но если вы просто хотите перевернуть массив, я бы использовал std::reverse из библиотеки алгоритмов C ++.   -  person bnaecker    schedule 09.05.2018
comment
Джеп, ты привел меня на верный путь, std :: reverse - это именно то, что мне нужно! Пожалуйста, оставьте свои комментарии и решение в ответе, я приму его позже, я ухожу, спасибо!   -  person sandkasten    schedule 09.05.2018


Ответы (1)


Похоже, вы хотите перевернуть массив, а не манипулировать порядком байтов любого из многобайтовых типов внутри массива. В стандартной библиотеке есть решение для этого:

QByteArray arr;
std::reverse(arr.begin(), arr.end());
// arr is now in reversed order
person bnaecker    schedule 09.05.2018