You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 04:36:07