big_endian和little_endian(转)
2015-06-04 10:32
281 查看
出处:http://www.cnblogs.com/hisiqi/archive/2012/10/04/2711472.html
big_endian 、little_endian 用于自动改变二进制位存放顺序
Big Endian and 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
低地址 高地址
----------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 12 | 34 | 56 | 78 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Little Endian
低地址 高地址
----------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 78 | 56 | 34 | 12 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
从上面两图可以看出,采用big endian方式存储数据是符合我们人类的思维习惯的。而little endian,!@#$%^&*,见鬼去吧 -_-|||
为什么要注意字节序的问题呢?你可能这么问。当然,如果你写的程序只在单机环境下面运行,并且不和别人的程序打交道,那么你完全可以忽略字节序的存在。但是,如果你的程序要跟别人的程序产生交互呢?尤其是当你把你在微机上运算的结果运用到计算机群上去的话。在这里我想说说两种语言。C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而J***A编写的程序则唯一采用big endian方式来存储数据。试想,如果你用C/C++语言在x86平台下编写的程序跟别人的J***A程序互通时会产生什么结果?就拿上面的0x12345678来说,你的程序传递给别人的一个数据,将指向0x12345678的指针传给了J***A程序,由于J***A采取big
endian方式存储数据,很自然的它会将你的数据翻译为0x78563412。什么?竟然变成另外一个数字了?是的,就是这种后果。因此,在你的C程序传给J***A程序之前有必要进行字节序的转换工作。
无独有偶,所有网络协议也都是采用big endian的方式来传输数据的。所以有时我们也会把big endian方式称之为网络字节序。当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。ANSI C中提供了下面四个转换字节序的宏。
下面来看看测试代码是不是一致的:
输出:
bigEndian 0xAABBCCDD
littleEndian 0xDDCCBBAA
big_endian 、little_endian 用于自动改变二进制位存放顺序
Big Endian and 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
低地址 高地址
----------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 12 | 34 | 56 | 78 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Little Endian
低地址 高地址
----------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 78 | 56 | 34 | 12 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
从上面两图可以看出,采用big endian方式存储数据是符合我们人类的思维习惯的。而little endian,!@#$%^&*,见鬼去吧 -_-|||
为什么要注意字节序的问题呢?你可能这么问。当然,如果你写的程序只在单机环境下面运行,并且不和别人的程序打交道,那么你完全可以忽略字节序的存在。但是,如果你的程序要跟别人的程序产生交互呢?尤其是当你把你在微机上运算的结果运用到计算机群上去的话。在这里我想说说两种语言。C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而J***A编写的程序则唯一采用big endian方式来存储数据。试想,如果你用C/C++语言在x86平台下编写的程序跟别人的J***A程序互通时会产生什么结果?就拿上面的0x12345678来说,你的程序传递给别人的一个数据,将指向0x12345678的指针传给了J***A程序,由于J***A采取big
endian方式存储数据,很自然的它会将你的数据翻译为0x78563412。什么?竟然变成另外一个数字了?是的,就是这种后果。因此,在你的C程序传给J***A程序之前有必要进行字节序的转换工作。
无独有偶,所有网络协议也都是采用big endian的方式来传输数据的。所以有时我们也会把big endian方式称之为网络字节序。当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。ANSI C中提供了下面四个转换字节序的宏。
下面来看看测试代码是不是一致的:
1 package 2 { 3 import flash.display.Sprite; 4 import flash.utils.ByteArray; 5 import flash.utils.Endian; 6 7 public class EndianTest extends Sprite 8 { 9 public function EndianTest() 10 { 11 init(); 12 } 13 14 private function init():void{ 15 16 var ba:ByteArray = new ByteArray(); 17 ba.writeByte(0xAA); 18 ba.writeByte(0xBB); 19 ba.writeByte(0xCC); 20 ba.writeByte(0xDD); 21 22 ba.position = 0; 23 trace(ba.endian,"0x"+ba.readUnsignedInt().toString(16).toUpperCase()); 24 ba.position = 0; 25 ba.endian = Endian.LITTLE_ENDIAN; 26 trace(ba.endian,"0x"+ba.readUnsignedInt().toString(16).toUpperCase()); 27 } 28 } 29 }
输出:
bigEndian 0xAABBCCDD
littleEndian 0xDDCCBBAA
相关文章推荐
- 转载: linux下创建svn代码库
- 引用类型 - object
- linux下查看和添加PATH环境变量
- LeetCode:Remove Duplicates from Sorted Array II
- Android酷炫实用的开源框架(UI框架)
- JavaScript中Function()函数的使用教程
- 常见查找算法之—二分查找
- 如何在Bash Shell脚本中显示对话框
- IOS开发之MPMusicPlayerController
- 波克城市棋牌源码,傲翼棋牌源码3D人物效果!(本人二次开发)
- 二叉树的遍历(1):前序遍历
- 内联汇编使用简介
- ca-bundle.crt to java truststore(e.g. trustStore.jks)
- mac os 利用ssh 搭建git server服务器详细教程,以及git基本用法
- java socket 通信实例
- MySQL高可用架构之MHA
- linux定时任务crontab详解
- 二维数组中的查找
- powershell 枚举远程主机登录会话 [PowerQuinsta]
- POJ3262 Protecting the Flowers(贪心)