用于网络和主机顺序的Java中的字节顺序转换

Ash*_*ley 3 java encoding network-programming endianness

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

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

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

use*_*421 8

这个话题很简单,但我可能会在这里混淆一​​下.网络字节顺序是Big-Endian.默认情况下,Java也使用Big-endian(就像类文件一样).

对于类文件,DataOutputStream,DataInputStream,ObjectInputStream,ObjectOutputStream和java.nio.*,我可能已经遗漏了一些东西.

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

不.'新创建的ByteBuffer的顺序总是大端的'.见Javadoc.

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

它已经是.

另外,在将数据从通道读取到ByteBuffer时,我是否必须执行相反的操作?

它已经是.

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

DataInputStream和DataOutputStream使用big-endian.见Javadoc.

我是否应该始终了解主机的Endianness?

不是Java.

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

这已经发生在默认情况下.

就Endianness而言,对于默认文件格式,比如在Windows上,它总是Little-Endian.

不,不是.往上看.

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

往上看.不必要.