文章出处:http://blog.csdn.net/goldenhunter/article/details/4508717
参考文献:http://en.wikipedia.org/wiki/Endianness
字节序与位序实际是一致的。
根据计算机设计的架构模式不同,一般CPU(和一些外设)区分为大端序和小端序,另外也有所谓混合序的设备存在,这种设备在这里不做考虑。
所谓大端序,就是当机器沿着地址从低地址向高地址读的时候,第一个读取到的字节byte或位bit 都是最高的一位(MSB:Most Significant Bit, 最高有效位)或最高的一个byte。
(本文所描述内容均不考虑补码导致的实际存储数据变化)
如下所示:
地址低位---------------->地址增长方向---------------->地址高位
数据高位 | 10001111 | 01010000 | 数据地位
| byte1 byte2
|
/|/
pointer
指针指在第一个bit处,当读取的时候依次读入1000111101010000 (依次读入0x8f, 0x50)这个16位的数就是0x8f50
而低端序对应的16位数0x8f50的存储方式为:
地址低位---------------->地址增长方向---------------->地址高位
数据高位 | 00001010 | 11110001 | 数据地位
| byte1 byte2
|
/|/
pointer
读取的时候依次读入 0000101011110001;
从上可以看出从大端序到小端序,发生了两个变化:
1、 字节序排列方式的变化;高低互换;
2、 位序发生了变化,高低互换;
附:
ip首部的定义中:
struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u8 ihl:4,
version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
__u8 version:4,
ihl:4;
#else
#error "Please fix <asm/byteorder.h>"
#endif
__u8 tos;
__u16 tot_len;
__u16 id;
__u16 frag_off;
__u8 ttl;
__u8 protocol;
__u16 check;
__u32 saddr;
__u32 daddr;
/*The options start here. */
};
对于小端序的情况:(字节序与位序同)
ihl (LSB) version (MSB)
----------------------------------------------------------->
低地址 高地址
对于大端序的情况:
version (MSB) ihl (LSB)
----------------------------------------------------------->
低地址 高地址
而在ip首部的定义中,ip首部第一个字节的高4位存储的是version,低4位存储的是ip header len,这样对于大端序和小端序两种情况下,iphdr结构的定义与ip协议中的定义都是一致的。