You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:41:18