字节顺序是一个字中一个字中各个字节的顺序。字节序有两种,内存存储时分为把低序字节(也就是最右边的字节)存储在内存的起始位置,称为小端字节序(little-endian),反之,为大端字节序。Linux同时支持这两种类型的机器,为了在网络上统一,网络字节序是都是高位字节序,对比网络字节序和主机字节序,我的经验是遇到的机器都是小端字节序,ethreal上看到的都是转化成主机字节序的,以下程序可以本地机器的主机字节序测试。
#include <stdio.h>
int main()
{
union{
long s;
char c[sizeof(long)];
}un;
un.s=0x00001f44;
if ( un.c[0]==0x44 )
printf("little-endian/n");
else
printf("big-endian/n");
}
今天在《linux内核设计与实现》中看到了一个更简洁的做法
#include <stdio.h>
int main()
{
int i=1;
if ( *(unsigned char *)&i == 1 )
printf("little-endian/n");
else
printf("big-endian/n");
}
在include/linux/byteorder中包含了一组宏命令用于完成字节顺序之间的相互转换。最常用的宏命令:
u32 __cpu_to_be32(u32); /* 将cpu字节顺转换成大端字节序 */
u32 __cpu_to_le32(u32);
u32 __be32_to_cpu(u32);
u32 __le32_to_cpus(u32);