整数转大端序字节数组

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 是处理原始字节数据的理想容器
  • 字节序 决定多字节数据的存储顺序,必须与协议一致
  • 位序 决定单个字节内位的处理顺序,在串行通信中重要
  • 始终使用显式的字节序转换,避免依赖主机字节序
  • 进行充分的边界检查确保数据安全

理解这些概念对于实现正确的网络协议、文件格式和硬件通信至关重要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值