Endian.BIG_ENDIAN和Endian.LITTLE_ENDIAN(http://smartblack.iteye.com/blog/1129097)

Endian.BIG_ENDIAN和Endian.LITTLE_ENDIAN

在ByteArray和Socket中,能看到一个属性endain.
endian : String
更改或读取数据的字节顺序;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 

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

Little Endian 

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

     从上面两图可以看出,采用big endian方式存储数据是符合我们人类的思维习惯的。而little endian,[email protected]#$%^&*,见鬼去吧 -_-||| 

     为什么要注意字节序的问题呢?你可能这么问。当然,如果你写的程序只在单机环境下面运行,并且不和别人的程序打交道,那么你完全可以忽略字节序的存在。但是,如果你的程序要跟别人的程序产生交互呢?尤其是当你把你在微机上运算的结果运用到计算机群上去的话。在这里我想说说两种语言。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中提供了下面四个转换字节序的宏。
以上参考自http://hi.baidu.com/cuifenghui/blog/item/c3bd4b4a4bf9612209f7ef9a.html
下面来看看测试代码是不是一致的:
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
时间: 2024-08-30 06:16:17

Endian.BIG_ENDIAN和Endian.LITTLE_ENDIAN(http://smartblack.iteye.com/blog/1129097)的相关文章

大端和小端(big endian little endian)

一.大端和小端的问题 对于整型.长整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节):而 Little endian 则相反,它认为第一个字节是最低位字节(按照从低地址到高地址的顺序存放据的低位字节到高位字节). 例如,假设从内存地址 0x0000 开始有以下数据:  0x0000         0x0001       0x0002       0x0003  0x12            0x34          

大端和小端(Big endian and Little endian)

一.大端和小端的问题 对于整型.长整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节):而 Little endian 则相反,它认为第一个字节是最低位字节(按照从低地址到高地址的顺序存放据的低位字节到高位字节). 例如,假设从内存地址 0x0000 开始有以下数据:  0x0000         0x0001       0x0002       0x0003  0x12            0x34          

大endian和little endian

大endian和little endian 一般Intel处理器或X86平台是小端 ,只是有点老了摩托罗拉的处理器将采用大端,掌握一下小端序. 小端序一般指低地址存低字节.高地址存高字节.. .简称 "低低高高" 举个C语言的样例: #include<stdio.h> union u { int i; char j[2]; }a; void main() { a.j[0]='1'; a.j[1]='2'; printf("%x\n",a.i); } 由于

Big Endian与Litter Endian

Big Endian是大端,Litter Endian是小端,意思很明了,但是很难记住谁是谁.每次涉及到这个概念的时候,我都会GOOGLE一下,浪费精力. 怎样才能永远记住他们呢?网上搜索了一下,有很多人都存在这样的困惑,有人提出了一个比较好记的方法: Big Endian和Litter Endian被有些作者译为高尾端和低尾端.例如数字0x1122存入内存时, Big Endian的做法是:0x11 0x22,低地址放低字节,高地址放高(尾)字节. Litter Endian的做法是: 0x2

Mybatis入门实例(三)——使用MyBatis Generator生成DAO(转载http://qiuqiu0034.iteye.com/blog/1163026)

接上回 http://qiuqiu0034.iteye.com/blog/1162952 虽然MyBatis很方便,但是想要手写全部的mapper还是很累人的,好在MyBatis官方推出了自动化工具,可以根据数据库和定义好的配置直接生成DAO层及以下的全部代码,非常方便. 需要注意的是,虽然自动化工具需要一个配置文件,但是MyBatis的配置文件仍然不能少,自动化工具的配置文件用于对生成的代码的选项进行配置,MyBatis的配置文件才是运行时的主要配置文件. 这个工具叫做MyBatis_Gene

http://stamen.iteye.com/blog/1441794Spring @Trancation注解

Spring可以通过注解@Transactional来为业务逻辑层的方法(调用DAO完成持久化动作)添加事务能力. @Tranactional注解分析 作用域:Transactional作用于类上表示类上所有的方法使用指定的事务管理策略,作用于方法表示该方法使用指定的事务管理策略:如果方法和类同时定义了@Tranactional注解,那么方法上定义的@Tranactional的属性覆盖类上定义的@Tranactional的属性 value: 用于匹配Spring中定义的tranactionMan

学习windows内核书籍推荐 ----------转自http://tieshow.iteye.com/blog/1565926

虽然,多年java,正在java,看样子还得继续java.(IT小城,还是整java随意点)应用程序 运行于操作系统之上,  晓操作系统,方更晓应用程序.主看windows,因为可玩性高,闭源才有意思.(莫忘2008年,微软盗版黑屏事件)书籍推荐(全中文 ),按顺序======  windows应用程序  =============C&C++, 略 (懒~,就那几本,程序员都知道)<windows程序设计> (第5版.珍藏版), 非珍藏版的翻译垃圾,莫看<WINDOWS.核心编程

java web开发总结(五):如何进行系统优化的思考 (http://hillside.iteye.com/blog/580639)

前两天跟同事讨论,说到高并发系统如何做优化,提到这个问题,他说他有些茫然,有点不知道该如何下手. 我想了想这几年做的各种系统优化工作,正好也简单总结一下,总结起来就是:一个核心,N种手段. 一个核心就是:多.快.准. N种手段就要围绕上面的核心做的各种处理. 上面这个核心字多点说也就是:更多用户访问.更短响应时间.数据正确性. 优化的过程,我的想法就是先顺藤摸瓜,沿着一个请求发生的路径一路看过去,测量一下每个点上消耗的时间,会发现很多消耗时间多的点,都是值得你去优化的地方.然后再考虑在每个点上发

spring web flow 2.0入门(转:http://luanxiyuan.iteye.com/blog/2282126)

Spring Web Flow 2.0 入门详解 博客分类: spring 目录: 参考文献 购物车用例 什么情况下可以使用 Spring Web Flow? 配置 Spring Web MVC 配置 Spring Web Flow 2.0 的基础 在购物车示例应用中配置 Spring Web Flow 用 Unified EL 实现业务逻辑 用 subflow 实现添加商品到购物车功能 global transition 简介 1.参考文献 参考1:http://www.ibm.com/dev