字节数组的BigEndian和LittleEndian详解(备注)

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

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


Little Endian  

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

 

 

        从上面两图可以看出,采用big endian方式存储数据是符合我们人类的思维习惯的. 
        为什么要注意字节序的问题呢?如果你写的程序只在单机环境下面运行,并且不和别人的程序打交道,那么你完全可以忽略字节序的存在。但是,如果你的程序要跟别人的程序产生交互呢?在这里我想说说两种语言。C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而JAVA编写的程序则唯一采用big endian方式来存储数据。试想,如果你用C/C++语言在x86平台下编写的程序跟别人的JAVA程序互通时会产生什么结果?就拿上面的0x12345678来说,你的程序传递给别人的一个数据,将指向0x12345678的指针传给了JAVA程序,由于JAVA采取big endian方式存储数据,很自然的它会将你的数据翻译为0x78563412。什么?竟然变成另外一个数字了?是的,就是这种后果。因此,在你的C程序传给JAVA程序之前有必要进行字节序的转换工作。 
     无独有偶,所有网络协议也都是采用big endian的方式来传输数据的。所以有时我们也会把big endian方式称之为网络字节序。当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。

posted @ 2013-09-24 17:03  yurong3000  阅读(360)  评论(0编辑  收藏  举报