大小端字节序详解
小端字节序(Little-Endian)的概念
小端字节序(Little-Endian)是一种数据在内存中的存储方式,其特点是:
低字节(Least Significant Byte, LSB)存储在低地址。
高字节(Most Significant Byte, MSB)存储在高地址。
示例(uint16_t
数据 0x1234
的存储方式)
内存地址 | 字节内容(小端) |
---|---|
addr | 0x34 (低字节) |
addr+1 | 0x12 (高字节) |
代码解析:leBytesToU16
如何转换小端字节序
u_int16_t leBytesToU16(const u_int8_t* bytes) {return (static_cast<u_int16_t>(bytes[1]) << 8) | static_cast<u_int16_t>(bytes[0]); }
步骤分解
输入:
bytes
是一个指向小端存储的 2 字节数组(如{0x34, 0x12}
)。操作:
bytes[1]
(高字节0x12
)左移 8 位 →0x1200
。bytes[0]
(低字节0x34
)保持不变 →0x0034
。按位或(
|
)合并结果:0x1200 | 0x0034 = 0x1234
。
输出:正确的
uint16_t
值0x1234
。
对比大端字节序(Big-Endian)
大端字节序(Big-Endian)的存储方式相反:
高字节存储在低地址,低字节存储在高地址。
例如
0x1234
在大端中存储为{0x12, 0x34}
。
大端转换代码(对比)
u_int16_t beBytesToU16(const u_int8_t* bytes) {return (static_cast<u_int16_t>(bytes[0]) << 8) | static_cast<u_int16_t>(bytes[1]); }
为什么需要小端转换?
跨平台兼容性:
不同硬件(如 x86 是小端,网络协议通常用大端)可能导致数据解析错误。
需显式转换以确保数据一致性。
读取外部数据:
文件、网络数据流可能采用小端/大端存储,需按约定解析。
验证代码的测试用例
#include <iostream> #include <cassert>int main() {u_int8_t littleEndianData[] = {0x34, 0x12}; // 小端存储的 0x1234u_int16_t result = leBytesToU16(littleEndianData);assert(result == 0x1234); // 验证转换正确std::cout << std::hex << "Result: 0x" << result << std::endl;return 0; }
输出:
Result: 0x1234
关键点总结
小端存储:低字节在前,高字节在后。
转换逻辑:高字节左移 + 低字节合并。
应用场景:处理二进制数据、网络协议、跨平台数据交换。
如果需要处理更长的数据类型(如 uint32_t
),方法类似,但需调整移位位数(如 << 16
、<< 24
)。