`
cuixuxucui
  • 浏览: 350884 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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,!@#$%^&*,见鬼去吧 -_-||| 

 

     为什么要注意字节序的问题呢?你可能这么问。当然,如果你写的程序只在单机环境下面运行,并且不和别人的程序打交道,那么你完全可以忽略字节序的存在。但是,如果你的程序要跟别人的程序产生交互呢?尤其是当你把你在微机上运算的结果运用到计算机群上去的话。在这里我想说说两种语言。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

分享到:
评论

相关推荐

    Little_Big_endian.rar_big endian_little

    标题“Little_Big_endian.rar_big endian_little”暗示了这个压缩包包含了关于大端和小端字节序的详细信息,可能是专门针对嵌入式系统开发者的指南或教程。 **大端字节序(Big-endian)**: 在大端字节序中,数据的...

    Big-and-Little-Endian.rar_LIt_endian_little

    标题中的“Big-and-Little-Endian.rar_LIt_endian_little”可能是指一个压缩包,其中包含了一个名为“Big and Little Endian.pdf”的文件,该文件详细解释了这两种字节序的概念。 大端字节序(Big-Endian)是指数据...

    About-Endian.zip_Word for Word

    主要分为两种类型:大端序(Big-Endian)和小端序(Little-Endian)。在大端序中,最高位的字节存储在内存地址的低位,而最低位的字节存储在高位;相反,在小端序中,最低位的字节存储在内存的低位,最高位的字节...

    Macro-test-mode-test-system.zip_endian_little endian

    Endianness 主要分为两种:大端法(Big Endian)和小端法(Little Endian)。这个名为 "Macro-test-mode-test-system.zip_endian_little_endian" 的压缩包文件是为了帮助用户检测他们的个人计算机(PC)使用的是哪种...

    endian.h文件

    windows编译probuf扩展时vs会缺少endian.h包,只需将这个文件包含在项目目录中即可通过编译

    Big Endian & Little Endian.pdf

    **Big Endian** 和 **Little Endian** 是指多字节数据(如整数或浮点数)在内存中存储时,字节间的排列顺序。这两种方式的区别主要在于最高有效字节(Most Significant Byte, MSB)和最低有效字节(Least ...

    大端(Big Endian)与小端(Little Endian)简介

    这些字节如何在内存中排列,涉及到两种主要的存储方式——大端(Big Endian)与小端(Little Endian)。本文将深入探讨这两种存储方式的概念、原理及其应用场景。 #### 二、大端与小端的定义 1. **大端表示法(Big...

    STM32F103CB_Big_Little_Endian_Demo.zip

    基于STM32HAL库,USART-调试串口(大小端测试),对应文章:https://blog.csdn.net/qq_36075612/article/details/115935138?spm=1001.2014.3001.5501

    little_ending.zip_大端

    "大端"和"小端"(Big-endian和Little-endian)是指计算机系统中多字节数据(如整数或浮点数)在内存中的字节顺序。这两个术语源自Gulliver's Travels中的Lilliputians和Brobdingnagians,用来形象地比喻大小不同的...

    read_sac.zip_sac文件_shakexh2_地震台站_简洁高效_读取SAC文件的代码

    在描述中提到的“read_sac.zip”是一个包含读取SAC文件代码的压缩包,其中包含三个MATLAB脚本文件:`readsac.m`、`rsac_big.m`和`rsac_little.m`。这些脚本可能实现了不同方式来读取SAC文件的元数据和波形数据,以...

    AP.rar_endian_大端

    "大端"(Big-Endian)和"小端"(Little-Endian)是两种主要的字节序类型,它们决定了多字节数据(如整数或浮点数)在内存中的字节排列顺序。 大端字节序,正如其名,是指数据的最高有效字节(MSB,Most Significant...

    Endian.rar_网络编程_C/C++_

    有两种主要的字节序:大端字节序(Big-Endian)和小端字节序(Little-Endian)。理解字节序对于进行跨平台网络编程至关重要,因为不同的计算机架构可能使用不同的字节序来存储数据。 1. **大端字节序**:在大端模式...

    io_no.rar_little

    有两种主要的字节序类型:小端字节序(Little-endian)和大端字节序(Big-endian)。小端字节序的特征是最低有效字节位于最低地址,而最高有效字节位于最高地址。相反,大端字节序则是最高有效字节在前,最低有效...

    speex_header.rar_little_speex

    描述中的"Convert little endian"提示我们需要关注的是字节序问题。在计算机系统中,字节序是指多字节数字(如整数或浮点数)在内存或数据传输中的字节排列顺序。"Little endian"表示小端字节序,即最低有效字节存储...

    hyts_Foo.rar_swap

    有两种主要的字节序:大端字节序(Big-Endian)和小端字节序(Little-Endian)。大端字节序中,最高位的字节存储在最低地址,而小端字节序则相反,最低位的字节存储在最低地址。不同的处理器架构可能采用不同的字节...

    EndianUtils.rar_Different

    2. `read_big_endian` 和 `write_big_endian`: 这两个函数可能用于读取和写入大端字节序的整数或浮点数。它们会根据目标系统的字节序进行适当的转换。 3. `read_little_endian` 和 `write_little_endian`: 同理,这...

    baycom.rar_little

    有两种主要类型:小端字节序(Little-Endian)和大端字节序(Big-Endian)。在小端字节序中,最低有效位(Least Significant Bit, LSB)存储在内存的最低地址,而最高有效位(Most Significant Bit, MSB)则存储在较...

    cmb.rar_space

    在压缩包的文件列表中,有两个源代码文件:`big_endian.c`和`cmb.c`。`big_endian.c`可能包含了处理大端字节序的函数,因为无线通信协议的数据交换往往需要考虑到字节序问题,尤其是在多平台环境或者网络传输中。...

    little endian和big endian的概念解释

    ### Little Endian 和 Big Endian 的概念解释 #### 一、基本定义 在计算机科学领域,数据存储的方式对于数据处理的效率以及程序的兼容性至关重要。其中,Little Endian 和 Big Endian 是两种常见的字节顺序(Byte ...

    tex-swizzle.rar_little

    在IT行业中,尤其是在计算机编程和数据处理领域,端字节序(Endian)是一个重要的概念,主要涉及到多字节数据类型如何在内存中存储的问题。这里的"little-endian"指的是小端字节序,即数据的低字节存储在内存地址的...

Global site tag (gtag.js) - Google Analytics