大小端介绍与分析

1. 字节序

    字节序即字节的存储顺序,如果数据都是单字节的,那怎么存储无所谓了,但是对于多字节数据,比如int,double等,就要考虑存储的顺序了。字节序是硬件层面的东西,通常只和你使用的处理器架构有关,而和编程语言无关。字节序分为大端序和小端序。

   大端序:数据的高位字节存放在地址的低端 低位字节存放在地址高端。

   小端序:数据的高位字节存放在地址的高端 低位字节存放在地址低端。

0x1234567的大端字节序和小端字节序的写法如下图。

可见,大端模式和字符串的存储模式类似。但是也有各自的特点:
• 小端模式 :强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样。计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。
• 大端模式 :符号位的判定固定为第一个字节,容易判断正负。此外,人类还是习惯读写大端字节序。所以,除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存。

2. 比特序

       字节序是一个对象中的多个字节之间的顺序问题,比特序就是一个字节中的8个比特位(bit)之间的顺序问题。一般情况下系统的比特序和字节序是保持一致的。以二进制数值10110101为例,其在不同平台下的内存位序如下:

 

 大端的含义是数值的最高位1(最左边的1)放在了内存起始位置上,即数值10110101的大端内存布局为10110101。

    小端的含义是数值的最低位1(最右边的1)放在了内存起始位置上,即数值10110101的小端内存布局为10101101。

3.位域

    对于位域有一个约定:在C语言的结构体中如果包含了位域,如果位域A定义在位域B之前,那么位域A总是出现在低地址的比特位。 这就决定了网络编程中位域在定义时必须处理大小端问题。(同样,结构体中前面的成员也处于较低的地址)

        对于IP头,可以这样理解,网络传输时version在前,ihl在后,网络是大端序,可以认为version是数字的高位,ihl是低位,所以:

       在大端机中,由于低地址是高位,所以位域version必须在前面;

      在小端机中,由于高地址是高位,所以位域version必须在后面。

   如下代码所示:

  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;
          __be16  tot_len;
          __be16  id;
          __be16  frag_off;
          __u8    ttl;
         __u8    protocol;
         __sum16 check;
         __be32  saddr;
         __be32  daddr;
         /*The options start here. */
 };
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值