Java nio 之 buffer order

来源:互联网 发布:汽车动力学仿真软件 编辑:程序博客网 时间:2024/05/18 01:41


本文整理自《Java NIO》一书,另参考blog:http://www.cnblogs.com/JeffreyZhao/archive/2010/02/10/byte-order-and-related-library.html


在一个32位的CPU中“字长”为32个bit,也就是4个byte。在这样的CPU中,总是以4字节对齐的方式来读取或写入内存,那么同样这4个字节的数据是以什么顺序保存在内存中的呢?例如,

现在我们要向内存地址为a的地方写入数据0x0A0B0C0D,那么这4个字节分别落在哪个地址的内存上呢?这就涉及到字节序的问题了。

每个数据都有所谓的“有效位(significant byte)”,它的意思是“表示这个数据所用的字节”。例如一个32位整数,它的有效位就是4个字节。而对于0x0A0B0C0D来说,它的有效位从高到低便是0A、0B、0C及0D——这里您可以把它作为一个256进制的数来看(相对于我们平时所用的10进制数)。

而所谓大字节序(big endian),便是指其“最高有效位(most significant byte)”落在低地址上的存储方式。例如像地址a写入0x0A0B0C0D之后,在内存中的数据便是:

Big Endian

而对于小字节序(little endian)来说就正好相反了,它把“最低有效位(least significant byte)”放在低地址上。例如:

Little Endian

对于我们常用的CPU架构,如Intel,AMD的CPU使用的都是小字节序,而例如Mac OS以前所使用的Power PC使用的便是大字节序(不过现在Mac OS也使用Intel的CPU了)。此外,除了大字节序和小字节序之外,还有一种很少见的中字节序(middle endian),它会以2143的方式来保存数据(相对于大字节序的1234及小字节序的4321)。

在java.nio中,字节顺序由ByteOrder类封装。

package java.nio; public final class ByteOrder { public static final ByteOrder BIG_ENDIAN public static final ByteOrder LITTLE_ENDIAN public static ByteOrder nativeOrder( ) public String toString( ) }

ByteOrder类定义了决定从缓冲区中存储或检索多字节数值时使用哪一字节顺序的常量。这个类的作用就像一个类型安全的枚举。它定

义了以其本身实例预初始化的两个public区域。只有这两个ByteOrder实例总是存在于JVM中,因此它们可以通过使用--操作符进行比

较。如果您需要知道JVM运行的硬件平台的固有字节顺序,请调用静态类函数nativeOrder()。它将返回两个已确定常量中的一个。调用

toString()将返回一个包含两个文字字符串BIG_ENDIAN或者LITTLE_ENDIAN之一的String。


假设一个叫buffer的ByteBuffer对象处于下图的状态:


这段代码: 
int value = buffer.getInt( ); 
会返回一个由缓冲区中位置1-4的byte数据值组成的int型变量的值。实际的返回值取决于缓冲区的当前的比特排序(byte-order)设置。
更具体的写法是: 
int value = buffer.order (ByteOrder.BIG_ENDIAN).getInt( ); 
这将会返回值0x3BC5315E,
同时: 
int value = buffer.order (ByteOrder.LITTLE_ENDIAN).getInt( ); 
返回值0x5E31C53B。


0 0
原创粉丝点击