主题相当简单,但我可能会在这里混淆一下。网络字节顺序是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)
?另外,在阅读从Channel
到ByteBuffer
的数据时,我是否必须反过来?使用java.io
包
问题的另一部分还涉及到机器本身的工作。
答案 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也会这样做(在这个操作系统上)。