如何在Linux内核中考虑Endian获取16位整数的最高/最低有效字节
Linux内核16位整数高低有效字节获取方案
Linux内核已经提供了跨架构兼容的字节序处理通用宏,无需手动适配大小端,实现方案如下:
基础宏说明
所有宏均定义在<linux/byteorder/generic.h>头文件中,可直接引用:
- 取16位整数逻辑最低有效字节(LSB):
lo8(x),等价于((uint8_t)((x) & 0xff)),返回值范围0~0xff - 取16位整数逻辑最高有效字节(MSB):
hi8(x),等价于((uint8_t)((x) >> 8)),返回值范围0~0xff - 小端存储16位值转CPU字节序:
le16_to_cpu(x) - 大端存储16位值转CPU字节序:
be16_to_cpu(x)
注:C语言的位移操作本身是针对数值逻辑值计算,和架构字节序无关,你之前遇到的结果异常是直接访问内存地址取字节、或者未转换非CPU字节序输入值导致的。
使用示例
#include <linux/byteorder/generic.h> #include <linux/types.h> void sample_process(void) { u16 cpu_val = 0x1234; __le16 le_val = cpu_to_le16(0x1234); // 小端存储的16位值 __be16 be_val = cpu_to_be16(0x1234); // 大端存储的16位值 u8 lsb, msb; // 处理CPU原生字节序的16位值 lsb = lo8(cpu_val); // 得到0x34 msb = hi8(cpu_val); // 得到0x12 // 处理小端格式的16位输入值 lsb = lo8(le16_to_cpu(le_val)); // 得到0x34 msb = hi8(le16_to_cpu(le_val)); // 得到0x12 // 处理大端格式的16位输入值 lsb = lo8(be16_to_cpu(be_val)); // 得到0x34 msb = hi8(be16_to_cpu(be_val)); // 得到0x12 }
内容的提问来源于stack exchange,提问作者Harry Muscle
相关产品推荐
相关产品推荐

