用户态我们常使用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