Big Endian和Little Endian的区别

本文解释了BigEndian和LittleEndian的概念及其区别,探讨了这两种字节序在网络传输中的应用,并介绍了如何判断系统使用的字节序。
一直不明白既然目前多数CPU内部都使用Little Endian字节序,为什么ActionScript3中的ByteArray默认使用Big Endian字节序。

看了下面的文章,大致明白了:

或许ActionScript是为了兼容TCP/IP协议的Big Endian字节序?

下文转自:http://linux.chinaunix.net/techdoc/desktop/2009/06/26/1120396.shtml

Big Endian和Little Endian的区别

  1. 故事的起源 “endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。 我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。
  2. 什么是Big Endian和Little Endian? 在设计计算机系统的时候,有两种处理内存中数据的方法。一种叫为little-endian,存放在内存中最低位的数值是来自数据的最右边部分(也就是数据的最低位部分)。 比如某些文件需要在不同平台处理,或者通过Socket通信。这方面我们可以借助ntohl(), ntohs(), htonl(), and htons()函数进行格式转换, 个人补充:一个操作数作htonl或ntohl结果不一定相同,当机器字节序跟网络字节序刚好是仅仅big endian和little endian的区别时是相同的。
  3. 如何理解Big Endian和Little Endian 举个例子: int a = 1; a这个数本身的16进制表示是0×00 00 00 01 在内存中怎么存储呢? 如果你的CPU是intel x86架构的(基本上就是通常我们说的奔腾cpu),那么就是0×01 0×00 0×00 0×00 , 这也就是所谓的little-endian, 低字节存放在内存的低位. 如果你的CPU是老式AMD系列的(很老很老的那种,因为最新的AMD系列已经是x86架构了), 它的字节序就是big-endian, 其内存存储就是 0×00 0×00 0×00 0×01在内存中从高字节开始存放。 现在世界上绝大多数的CPU都是little-endian。
  4. 了解big-endian和little-endian有什么作用? 一个重要的作用就是了解在网络上不同的机器间的数据如何传输。 假设我们在网络上有两台机器A和B, 其中A为little-endian,B为big-endian 机器A要传输上面的整数a给机器B,如何传输呢? 过程是这样的: 机器A先把a在内存中的四个字节0x 01 0×00 0×00 0×00转化为网络字节序0×00 0×00 0×00 0×01,然后一个字节一个字节(从0×00到0×01)喂到网络上去 然后机器B从网络上一个字节一个字节地取出四个字节0×00 0×00 0×00 0×01后又会转化为本地字节序 0×00 0×00 0×00 0×01后放入内存。因而B正确地得到了来自A的数据a 如果数据缺少在网络上的字节序转换的话,情况会怎样呢? 机器A先把a由在内存的四个字节0x 01 0×00 0×00 0×00 一个字节一个字节地喂到网络上,然后机器B从网络上一个字节一个字节地收到0x 01 0×00 0×00 0×00并放入到内存中, B认为他收到了0×01000000, 也就是十进制数1677216,这显然是错误的.
  5. 如何判断系统是Big Endian还是Little Endian? 在/usr/include/中(包括子目录)查找字符串BYTE_ORDER(或_BYTE_ORDER, __BYTE_ORDER),确定其值。这个值一般在endian.h或machine/endian.h文件中可以找到,有时在feature.h中,不同的操作系统可能有所不同。一般来说,Little Endian系统BYTE_ORDER(或_BYTE_ORDER,__BYTE_ORDER)为1234,Big Endian系统为4321。大部分用户的操作系统(如windows, FreeBsd,Linux)是Little Endian的。少部分,如MAC OS ,是Big Endian 的。本质上说,Little Endian还是Big Endian与操作系统和芯片类型都有关系。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值