[Linux]Linux中的big endian和little endian

1、由来

Big-endian和Little-endian是用来表述一组有序的字节数存放在计算机内存中时的顺序的术语。Big-endian(即“大端结束”或者“大尾”)是将高位字节(序列中最重要的值)先存放在低地址处的顺序,而Little-endian(即“小端结束”或者“小尾”)是将低位字节(序列中最不重要的值)先存放在低地址处的顺序。举例来说,在使用Big-endian顺序的计算机中,要存储一个十六进制数4F52所需要的字节将会以4F52的形式存储(比如4F存放在内存的1000位置,而52将会被存储在1001位置)。而在使用Little-endian顺序的系统中,存储的形式将会是524F(52在地址1000处,4F在地址1001处)。IBM的370种大型机、大多数基于RISC的计算机以及Motorola的微处理器使用的是Big-endian顺序,TCP/IP协议也是。而Intel的处理器和DEC公司的一些程序则使用的Little-endian方式。 
“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。

2、举例说明

big endian:最高字节在地址最低位,最低字节在地址最高位,依次排列。
little endian:最低字节在最低位,最高字节在最高位,反序排列。

endian指的是当物理上的最小单元比逻辑上的最小单元小时,逻辑到物理的单元排布关系。咱们接触到的物理单元最小都是byte,在通信领域中,这里往往是bit,不过原理也是类似的。

用文字说明可能比较抽象,下面用图像加以说明。比如数字0x12345678在两种不同字节序CPU中的存储顺序如下所示:

Big Endian

   低地址                                            高地址
   ----------------------------------------->
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     12     |      34    |     56      |     78    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Little Endian

   低地址                                            高地址
   ----------------------------------------->
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     78     |      56    |     34      |     12    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

一个例子:
如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
                big-endian     little-endian
0x0000     0x12              0xcd
0x0001     0x34              0xab
0x0002     0xab              0x34
0x0003     0xcd              0x12

3、Linux网络协议中的转换实现代码

网络字节序由big-endian转为little-endian

#define u32toValue(x) ((__u32)( /

                                  (((__u32)(x) & (__u32)0x000000ffUL) << 24) | /

                                  (((__u32)(x) & (__u32)0x0000ff00UL) <<   8) | /

                                  (((__u32)(x) & (__u32)0x00ff0000UL) >>   8) | /

                                  (((__u32)(x) & (__u32)0xff000000UL) >> 24) ))

IP地址转为显示地址:

static void IpAddressToString(unsigned long i, char* s)

{

     unsinged long j1, j2,j3,j4;

     j1 = (i & 0x000000FF);

     j2 = (i & 0x0000FF00)>>8;

     j3 = (i & 0x00FF0000)>>16;

     j4 = (i & 0xFF000000)>>24;

     sprintf(s, "%u.%u.%u.%u", j4,j3,j2,j1); //注意顺序

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值