如何在Qt 5.6.2中将QByteArray从大端转换为小端?
解决Qt 5.6.2中QByteArray大端转小端的问题
你遇到的问题其实是对Qt内置字节序工具的使用场景理解有点偏差,咱们一步步拆解清楚:
为什么之前的方法失效?
qToLittleEndian():这个函数是专门针对单个基本数据类型(比如qint32、quint16这类固定长度的数值)设计的,它的作用是把一个数值从主机字节序转成小端字节序的字节表示,并不是直接对整个QByteArray的字节序列做反转。直接传QByteArray的话,因为没有对应的重载,相当于没做任何处理,所以输出还是原数据。QDataStream:用它写QByteArray时,Qt会先自动写入一个4字节的长度字段(按照你设置的字节序),然后才写入原字节数据。你看到的03000000就是小端表示的长度3,后面的010203是原数据,这显然不是你想要的纯字节反转结果。
合适的解决方案
方案1:直接反转字节数组(最适合你的场景)
你要的效果其实是把整个字节序列倒序,这在Qt里可以借助标准库的std::reverse来实现,简单直接:
#include <algorithm> // 需要包含这个头文件 QByteArray value; value.append(0x01); value.append(0x02); value.append(0x03); qDebug() << "Original value is: " << value.toHex(); // 输出"010203" // 反转字节数组得到小端结果 QByteArray littleEndianValue = value; std::reverse(littleEndianValue.begin(), littleEndianValue.end()); qDebug() << "Little-endian value is: " << littleEndianValue.toHex(); // 输出"030201"
方案2:针对固定长度数值类型转换(如果你的字节是数值的话)
如果你的QByteArray存储的是某个固定长度的数值(比如2字节的quint16、4字节的qint32),可以先把字节转成数值,再转成小端字节序:
QByteArray value; value.append(0x01); value.append(0x02); value.append(0x03); value.append(0x04); // 先从大端字节序转成数值 quint32 num = qFromBigEndian<quint32>(reinterpret_cast<const uchar*>(value.data())); // 再把数值转成小端字节序的QByteArray QByteArray littleEndianData; littleEndianData.append(reinterpret_cast<const char*>(&num), sizeof(num)); qDebug() << littleEndianData.toHex(); // 输出"04030201"
但你的场景是3字节的纯字节序列反转,方案1完全够用,不需要手动逐个字节交换,用std::reverse既简洁又不容易出错。
内容的提问来源于stack exchange,提问作者sandkasten
相关产品推荐
相关产品推荐

