qbytearray转换大小端
时间: 2025-02-01 07:49:34 浏览: 87
### 如何使用 `QByteArray` 进行大端小端字节序转换
在Qt中处理不同平台之间的通信时,经常需要考虑字节序问题。对于多字节数据类型(如短整型、长整型),不同的机器可能采用不同的存储顺序——即大端或小端。
#### 大端到小端的转换
当需要将一个16位无符号整数从当前主机字节序转换为网络字节序(通常是大端)时,可以先利用`qToBigEndian()`函数将其转换为大端表示形式,再通过`QDataStream`类或者手动操作内存来完成进一步的操作:
```cpp
quint16 hostValue = 0x1234;
// 创建一个长度为2的QByteArray对象用于保存转换后的结果
QByteArray bigEndianBytes(2, '\0');
// 执行实际的大端转换并填充至byte array
qToBigEndian(hostValue, reinterpret_cast<uchar*>(bigEndianBytes.data()));
```
如果要验证这个过程是否成功,则可以通过打印出该数组的内容来进行确认:
```cpp
for(int i=0;i<bigEndianBytes.size();++i){
qDebug()<<QString("%1").arg((ushort)bigEndianBytes[i], 2, 16).rightJustified(2,'0').toUpper();
}
```
上述代码会输出两个十六进制字符组成的字符串:“12”,“34”。
#### 小端到大端的转换
假设现在有一个以小端格式存储于`QByteArray`中的数值,并希望将其转换为大端格式以便在网络上传输或其他目的下使用。此时应该首先提取原始的小端值,接着调用相应的宏定义实现大小端互换,最后再次放入新的容器内等待后续处理:
```cpp
QByteArray littleEndianBytes("\x34\x12", 2);
quint16 originalLittleEndian;
memcpy(&originalLittleEndian,littleEndianBytes.constData(),littleEndianBytes.length());
if(QSysInfo::ByteOrder == QSysInfo::LittleEndian){
// 如果系统本身是小端则无需额外变换直接赋给目标变量
}else{
// 否则需显式指定源地址指针以及目标缓冲区首位置参数
qFromBigEndian(originalLittleEndian,reinterpret_cast<uchar*>(&originalLittleEndian));
}
// 构建一个新的QByteArray实例容纳最终得到的结果
QByteArray convertedBigEndianBytes(2,'\0');
// 应用之前介绍过的技巧完成整个流程
qToBigEndian(originalLittleEndian,reinterpret_cast<uchar*>(convertedBigEndianBytes.data()));
// 输出检验效果
for(auto byte : convertedBigEndianBytes){
qDebug()<<QString("%1").arg(byte, 2, 16).rightJustified(2,'0').toUpper();
}
```
这段程序将会依次显示“12”、“34”。这表明原本处于小端布局下的二进制编码已经被正确地调整为了大端排列方式[^2]。
阅读全文
相关推荐
















