字节序与位序

文章出处: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. */  
}; 

 

根据上一篇中的  Kevin's Theory #2: In a C structure that contains bit fields, if field A is defined in front of field B, then field A always occupies a lower bit address than field B, 可知:

 

对于小端序的情况:(字节序与位序同)

 ihl  (LSB)                                    version  (MSB)

----------------------------------------------------------->

低地址                                                        高地址

 

对于大端序的情况:

 version (MSB)                                       ihl (LSB)

----------------------------------------------------------->

低地址                                                         高地址

 

而在ip首部的定义中,ip首部第一个字节的高4位存储的是version,低4位存储的是ip header len,这样对于大端序和小端序两种情况下,iphdr结构的定义与ip协议中的定义都是一致的。



 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值