3

这个话题很简单,但我可能在这里有点困惑。网络字节顺序是 Big-Endian。默认情况下,Java 也使用 Big-endian(与类文件一样)。我的 windows 机器使用 Intel 处理器,它是 Little-Endian,Windows 本身也使用 Little-Endian。所以,如果我使用 a java.nio.ByteBuffer.allocateDirect(),那么默认的 Endianness 是 Little-Endian (因为操作系统和/或处理器),但是,如果我想在网络上发送这些数据,在从 读取数据时 ByteBuffer,我需要使用ByteBuffer.order(ByteOrder.BIG_ENDIAN)吗?Channel此外,从 a到 a读取数据时我是否必须做相反的事情ByteBuffer?使用java.io包时我几乎忽略了它

问题的另一部分也与机器本身的工作有关。

  1. 我是否应该始终注意主机的字节顺序?因此,无论使用何种本地数据存储格式,在本机环境下都可以,但是,在发送到网络时将数据转换为 BIG_ENDIAN。
  2. 就字节序而言,对于默认文件格式,比如在 Windows 上,它总是小字节序。但是,现在在 MAC 或带有 Big-Endian 的 Linux 上使用相同的文件,我应该使用字节顺序标记 (BOM) 保存它吗?
4

2 回答 2

8

这个话题很简单,但我可能在这里有点困惑。网络字节顺序是 Big-Endian。默认情况下,Java 也使用 Big-endian(与类文件一样)。

对于类文件,DataOutputStream、DataInputStream、ObjectInputStream、ObjectOutputStream 和 java.nio.*,我可能遗漏了一些内容。

如果我使用 java.nio.ByteBuffer.allocateDirect(),那么默认的字节序是 Little-Endian(因为操作系统和/或处理器)

不。'新创建的 ByteBuffer 的顺序总是大端'。请参阅 Javadoc。

如果我想在网络上发送这些数据,从 ByteBuffer 读取数据,我需要使用 ByteBuffer.order(ByteOrder.BIG_ENDIAN) 吗?

已经是了。

此外,在将数据从 Channel 读取到 ByteBuffer 时,我是否必须做相反的事情?

已经是了。

使用 java.io 包时我几乎忽略了它

DataInputStream 和 DataOutputStream 使用大端。请参阅 Javadoc。

我是否应该始终注意主机的字节顺序?

不是在 Java 中。

因此,无论使用何种本地数据存储格式,在本机环境下都可以,但是,在发送到网络时将数据转换为 BIG_ENDIAN。

这已经默认发生了。

就字节序而言,对于默认文件格式,比如在 Windows 上,它总是小字节序。

不,不是。看上面。

但是,现在在 MAC 或带有 Big-Endian 的 Linux 上使用相同的文件,我应该使用字节顺序标记 (BOM) 保存它吗?

看上面。不必要。

于 2013-10-15T22:31:17.230 回答
-2

您需要始终发送相同的 Endian 样式。你选择哪一个应该基于它在主机上的处理速度。如果您的代码主要用于基于 x86 的机器上的 iE,则建议在所有地方都使用 little Endian。在内部,JVM 会做同样的事情(在这个操作系统上)。

于 2013-10-15T16:26:49.360 回答