摘要:其实big endian是指低地址存放最高有效字节(MSB),而little endian则是低地址存放最低有效字节(LSB)。

在ByteArray和Socket中,能看到一个属性endain.更改或读取数据字节顺序:Endian.BIG_ENDIAN或Endian.LITTLE_ENDIAN。

 

谈到字节序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。那么究竟什么是big endian,什么又是little endian呢? 

 

其实big endian是指低地址存放最高有效字节(MSB),而little endian则是低地址存放最低有效字节(LSB)。 

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

 

从上面图中可以看出,采用big endian方式存储数据是符合我们人类的思维习惯的,而little endian则看起来很别扭。

 

为什么要注意字节序的问题呢?你可能这么问。当然,如果你写的程序只在单机环境下面运行,并且不和别人的程序打交道,那么你完全可以忽略字节序的存在。但是,如果你的程序要跟别人的程序产生交互呢?尤其是当你把你在微机上运算的结果运用到计算机群上去的话。在这里我想说说两种语言。C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而JAVA编写的程序则唯一采用big endian方式来存储数据。试想,如果你用C/C++语言在x86平台下编写的程序跟别人的JAVA程序互通时会产生什么结果?就拿上面的0x12345678来说,你的程序传递给别人的一个数据,将指向0x12345678的指针传给了JAVA程序,由于JAVA采取big endian方式存储数据,很自然的它会将你的数据翻译为0x78563412。什么?竟然变成另外一个数字了?是的,就是这种后果。因此,在你的C程序传给JAVA程序之前有必要进行字节序的转换工作。 

 

无独有偶,所有网络协议也都是采用big endian的方式来传输数据的。所以有时我们也会把big endian方式称之为网络字节序。当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。ANSI C中提供了下面四个转换字节序的宏。


下面来看看测试代码是不是一致的:

package

{

import flash.display.Sprite;

import flash.utils.ByteArray;

import flash.utils.Endian;


public class ByteArrayTest extends Sprite

{

public function ByteArrayTest()

{

init();

}


private function init():void{

var ba:ByteArray = new ByteArray();


ba.writeByte(0xAA);

ba.writeByte(0xBB);

ba.writeByte(0xCC);

ba.writeByte(0xDD);


ba.position = 0;

trace(ba.endian,"0x"+ba.readUnsignedInt().toString(16).toUpperCase());


ba.position = 0;

ba.endian = Endian.LITTLE_ENDIAN;

trace(ba.endian,"0x"+ba.readUnsignedInt().toString(16).toUpperCase());

}

}

}


输出:

bigEndian 0xAABBCCDD

littleEndian 0xDDCCBBAA


文章版权为朗度云所有,转载必须声明出处,否则保留追究法律责任。

版权说明:如无特殊说明,文章均为本站原创,如需转载请注明出处

本文标题:大端BIG_ENDIAN和小端LITTLE_ENDIAN区别

本文地址:http://www.wolfbe.com/detail/201608/274.html

本文标签: LITTLE_ENDIAN BIG_ENDIAN

相关文章

热门文章

感谢您的支持,朗度云将继续前行

扫码打赏,金额随意

温馨提醒:打赏一旦完成,金额无法退还,请谨慎操作!

扫二维码 我要反馈 回到顶部