QByteArray 字节与位序详解
QByteArray 基础
定义与特性
QByteArray 是 Qt 中用于处理原始字节数据的类,可以看作是一个动态的字节数组。
QByteArray byteArray;
基本操作
// 创建和初始化
QByteArray data(10, 0); // 10个字节,全部初始化为0
QByteArray data2 = "Hello"; // 从字符串创建
QByteArray data3;
data3.resize(8); // 调整大小
// 添加数据
data.append(0x12); // 添加单个字节
data.append("\x34\x56", 2); // 添加多个字节
// 访问数据
char byte = data[0]; // 访问第一个字节
uchar unsigned_byte = data.at(1); // 安全的访问方式
字节序(Byte Order)
什么是字节序
字节序指的是多字节数据在内存中的存储顺序。
大端序(Big-Endian)
- 高位字节在前,低位字节在后
- 符合人类阅读习惯
- 网络协议常用(网络字节序)
数值: 0x12345678
内存: [0x12] [0x34] [0x56] [0x78] // 地址递增方向
小端序(Little-Endian)
- 低位字节在前,高位字节在后
- x86/x64架构常用
数值: 0x12345678
内存: [0x78] [0x56] [0x34] [0x12] // 地址递增方向
QByteArray 中的字节序处理
位移量计算公式
对于 n 位整数,转换为 m 个字节的大端序:
第 i 个字节的位移量 = (m - 1 - i) × 8
其中:
m = 总字节数(32位:4字节,64位:8字节)
i = 字节索引(从0开始)
手动处理字节序
// 将32位整数转换为大端序字节数组
quint32 value = 0x12345678;
QByteArray array;
array.append(static_cast<char>((value >> 24) & 0xFF)); // 0x12 - 最高位(// 0x12 - 位移 24位 = (4-1-0)×8 = 24)
array.append(static_cast<char>((value >> 16) & 0xFF)); // 0x34
array.append(static_cast<char>((value >> 8) & 0xFF)); // 0x56
array.append(static_cast<char>(value & 0xFF)); // 0x78 - 最低位
// 结果: [0x12, 0x34, 0x56, 0x78]
总结
- QByteArray 是处理原始字节数据的理想容器
- 字节序 决定多字节数据的存储顺序,必须与协议一致
- 位序 决定单个字节内位的处理顺序,在串行通信中重要
- 始终使用显式的字节序转换,避免依赖主机字节序
- 进行充分的边界检查确保数据安全
理解这些概念对于实现正确的网络协议、文件格式和硬件通信至关重要。

310

被折叠的 条评论
为什么被折叠?



