linux内核字节序转换宏

用户态我们常使用htonl、ntohl等进行字节序转换。内核中也定义了相同的宏,定义在include/linux/byteorder.h中。

#define ___htonl(x) __cpu_to_be32(x)

#define ___htons(x) __cpu_to_be16(x)

#define ___ntohl(x) __be32_to_cpu(x)

#define ___ntohs(x) __be16_to_cpu(x)

#define htonl(x) ___htonl(x)

#define ntohl(x) ___ntohl(x)

#define htons(x) ___htons(x)

#define ntohs(x) ___ntohs(x)

这里的be代表big edition(大端),le代表little edtion(小端)。


在这个文件还定义了另外一种比较直观的宏

#define cpu_to_le64 __cpu_to_le64                    // 小端转换宏

#define le64_to_cpu __le64_to_cpu

#define cpu_to_le32 __cpu_to_le32

#define le32_to_cpu __le32_to_cpu

#define cpu_to_le16 __cpu_to_le16

#define le16_to_cpu __le16_to_cpu

#define cpu_to_be64 __cpu_to_be64                // 大端转换宏

#define be64_to_cpu __be64_to_cpu

#define cpu_to_be32 __cpu_to_be32

#define be32_to_cpu __be32_to_cpu

#define cpu_to_be16 __cpu_to_be16

#define be16_to_cpu __be16_to_cpu


文件中还可以看到一些以p结尾的宏,例如be32_to_cpup,以指针作为参数,转换结果作为返回值。

还有一些以s结尾的宏,例如be32_to_cpus,同样以指针作为参数,转换结果写入参数指向的内存,覆盖了原有数据。


知其然,知其所以然。


参考:

http://www.bruceblinn.com/linuxinfo/ByteOrder.html

你可能感兴趣的:(linux内核字节序转换宏)