跳到主要内容

字节序转换 (byteorder)

CPU 字节序与小端/大端格式之间的转换接口,用于协议解析、文件格式处理等跨平台场景。

背景

不同 CPU 架构的字节序不同(x86 为小端,ARM 可配置),而网络协议用大端(网络字节序),许多文件格式也规定字节序。本模块提供统一的转换接口,消除平台差异。

字节序检测

int cpu_is_big_endian(void);

运行时检测当前 CPU 是否为大端序。大端返回 1,小端返回 0。

转换接口

所有接口为 static inline,零额外调用开销。

CPU ↔ 小端

接口说明
cpu_to_le16(x)CPU 字节序 → 16位小端
le16_to_cpu(x)16位小端 → CPU 字节序
cpu_to_le32(x)CPU 字节序 → 32位小端
le32_to_cpu(x)32位小端 → CPU 字节序
cpu_to_le64(x)CPU 字节序 → 64位小端
le64_to_cpu(x)64位小端 → CPU 字节序

小端序下 cpu_to_lele_to_cpu 为恒等操作,大端序下做字节交换。同一方向的转换互为逆操作:le32_to_cpu(cpu_to_le32(x)) == x

CPU ↔ 大端

接口说明
cpu_to_be16(x)CPU 字节序 → 16位大端
be16_to_cpu(x)16位大端 → CPU 字节序
cpu_to_be32(x)CPU 字节序 → 32位大端
be32_to_cpu(x)32位大端 → CPU 字节序
cpu_to_be64(x)CPU 字节序 → 64位大端
be64_to_cpu(x)64位大端 → CPU 字节序

大端序下为恒等操作,小端序下做字节交换。

通用字节交换

接口说明
__swab16(x)16位字节交换
__swab32(x)32位字节交换
__swab64(x)64位字节交换
__swahw32(x)32位半字交换(高低16位互换)
__swahb32(x)32位半字内字节交换(每16位内部两字节互换)

使用示例

解析网络数据包

uint16_t port = be16_to_cpu(*(uint16_t *)packet->port_field);
uint32_t addr = be32_to_cpu(*(uint32_t *)packet->addr_field);

写入小端文件格式

*(uint32_t *)buf = cpu_to_le32(value);
*(uint16_t *)(buf + 4) = cpu_to_le16(count);