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

时间:2013-10-15 16:22:54

标签: java encoding network-programming endianness

主题相当简单,但我可能会在这里混淆一​​下。网络字节顺序是Big-Endian。默认情况下,Java也使用Big-endian(就像类文件一样)。我的Windows机器使用Intel处理器,Little-Endian和Windows本身也使用Little-Endian。因此,如果我使用java.nio.ByteBuffer.allocateDirect(),则默认的Endianness是Little-Endian(,因为操作系统和/或处理器),但是,如果我想在网络上发送此数据,在阅读ByteBuffer的数据时,是否需要使用ByteBuffer.order(ByteOrder.BIG_ENDIAN)?另外,在阅读从ChannelByteBuffer的数据时,我是否必须反过来?使用java.io

时,我几乎忽略了它

问题的另一部分还涉及到机器本身的工作。

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

2 个答案:

答案 0 :(得分:7)

  

主题相当简单,但我可能会在这里混淆一​​下。网络字节顺序是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。

  

我是否应该始终了解主机的字节顺序?

不是Java。

  

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

默认情况下已经发生。

  

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

不,不是。见上文。

  

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

见上文。没必要。

答案 1 :(得分:-1)

您需要始终发送相同的Endian样式。您选择哪一个应该基于在主机上处理的速度。如果您的代码是i.E.主要用于基于x86的机器,建议在整个地方使用小端。在内部,JVM也会这样做(在这个操作系统上)。