Java和字节序问题

5

Java如何处理字节序问题?如果您需要将应用程序从小端转移到大端或反之,则数据成员或类的属性会受到什么影响?


3
只有在读/写原始数据时,字节序才会有影响,比如通过网络接口或磁盘进行操作。 - Oliver Charlesworth
@OliCharlesworth,或通过IPC或管道或从文件中接收数据...无论何时读取或写入数据并且另一端的东西不是Java。 - Mike Samuel
3个回答

8
Java虚拟机在这方面进行了抽象处理,只要您完全在Java中工作,就不需要担心它。唯一需要考虑字节顺序的原因是当您与非Java进程或类似进程进行通信时。 编辑:已编辑以更清楚明确的措辞。

2
必须点踩。当你处理一个由非Java应用程序以不同字节序写出的二进制文件时,还有一个主要的时间需要担心字节序。字节序是一个词吗? :-) - user949300
@user949300 你说的是对的,尽管我认为这属于“与非Java进程通信”的范畴。 - nonVirtualThunk
我不知道如何“取消踩”,但我很随和,所以我就点了个赞。然而,在我看来,“通信”意味着网络相关的东西,而不是从文件中读取。如果他明确提到文件会更清晰。顺便说一下,有些文件标准定义了字节序,因此即使Java写入文件,字节序也可能不符合Java标准。 - user949300
使用位运算符 & 和字面量(例如 0xFFFFFFFF00000000L)对原始类型 long 进行按位与操作是否安全? - n611x007

4
如果您正在将较大类型的缓冲区映射到 ByteBuffer 上,则可以使用 ByteOrder 值指定字节顺序。旧的核心库假设网络顺序。
ByteBuffer 中:
访问二进制数据
此类定义了读取和写入除布尔值之外的所有其他基本类型的值的方法。原始值根据缓冲区的当前字节顺序转换为(或从)字节序列,可以通过 order 方法检索和修改。特定的字节顺序由 ByteOrder 类的实例表示。字节缓冲区的初始顺序始终为 BIG_ENDIAN。 ByteOrder 提供对您正在工作的平台的 本机顺序 的访问。
与老的 DataInput 相比,它不能与本地本机服务进行互操作,毫无用处。

Reads four input bytes and returns an int value. Let a-d be the first through fourth bytes read. The value returned is:

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

2
类文件格式本身是大端序的(或者说类文件中所有的多字节数据都是以这种方式存储的): 类文件格式 引用块:
所有的16位、32位和64位数量都是通过连续读取两个、四个和八个8位字节来构造的。多字节数据项总是按照大端序存储,即高字节先出现。
但正如其他人所提到的,从实际考虑,你几乎不必担心这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接