2011-12-08 49 views
4

java如何处理字节顺序?如果您将应用程序从小端移动到大端,反之亦然。 类的数据成员或属性如何受到影响?Java和字节顺序

+3

如果您在原始数据上读取/写入原始数据,则排序只会很重要。网络接口或磁盘。 –

+0

@OliCharlesworth,或通过IPC或通过管道或文件或...接收数据,实际上您可以随时读取或写入数据,而另一端则不是java。 –

回答

3

清楚如果要映射的较大型的缓冲器在ByteBuffer则可以指定使用ByteOrder值的字节序。较早的核心库假定网络顺序。

ByteBuffer

访问二进制数据

此类定义所有其他基本类型的读取和写入值的方法,不同之处布尔值。根据缓冲区的当前字节顺序将原始值翻译为(或来自)字节序列,可通过顺序方法检索和修改。特定的字节顺序由ByteOrder类的实例表示。字节缓冲区的初始顺序始终为BIG_ENDIAN。

ByteOrder为您正在处理的平台提供了访问native order的权限。

与此相比,这是不是与当地的本土服务互操作有用旧DataInput

读取四个输入字节并返回一个int值。让a-d成为读取的第一个到第四个字节。返回的值是:

(((a & 0xff) << 24) | ((b & 0xff) << 16) | 
((c & 0xff) << 8) | (d & 0xff)) 
8

Java虚拟机将这种考虑抽象出来,只要您完全在Java中工作,就不需要担心它。你必须考虑字节顺序的唯一原因是你正在与非java进程或类似的进程通信。

编辑:编辑的措词

+1

必须downvote。当您处理由具有不同持久性的非Java应用程序写出的二进制文件时,还有另外一个重要时刻需要考虑排序。终究是一个字吗? :-) – user949300

+2

现在您应该立即断言答案已被修改。 –

+0

@ user949300你说的是真的,虽然我会说这属于“与非java进程通信”标题 – nonVirtualThunk

2

类文件格式本身是大端(或者更确切地说,在类文件中的所有多字节数据存储在这样一种方式):

Class file format

所有16位,32位和64位量分别通过读取2,4,8个连续的8位字节构成。多字节数据项总是以big-endian顺序存储,其中高字节排在第一位。

但正如别人提到的那样,作为一个实际的考虑,你应该几乎不用担心这一点。