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

Java中用于网络和主机顺序的字节顺序转换,java,encoding,network-programming,endianness,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

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

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

  • 我是否应该始终注意主机的持久性?因此,无论使用什么本地数据存储格式,在本机环境中都可以,但是,在发送到网络时,将数据转换为BIG_ENDIAN
  • 就尾端而言,对于默认的文件格式,比如说在windows上,它总是很小的尾端。但是,现在在MAC或Linux上使用Big-Endian的同一个文件,我应该用字节顺序标记(BOM)保存它吗
    您需要始终发送相同的Endian样式。您选择哪一个应该取决于它在主机上的处理速度。如果您的代码主要用于基于x86的机器上,建议您在所有地方都使用little Endian。JVM在内部也会这样做(在这个操作系统上)

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

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

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

    不,“新创建的Buffer的顺序总是big-endian”。请参阅Javadoc

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

    已经是了

    另外,在从通道读取数据到字节缓冲存储器时,是否必须执行相反的操作

    已经是了

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

    DataInputStream和DataOutputStream使用big-endian。请参阅Javadoc

    我是否应该始终注意主机的持久性

    不是用Java

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

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

    就尾端而言,对于默认的文件格式,比如说在windows上,它总是很小的尾端

    不,不是。见上文

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


    见上文。没有必要。

    谢谢你的回答。因此,除了类编写之外,JVM还将使用与默认操作系统相同的Endian,因此我现在了解到,无论发送/接收,网络字节顺序都应该首先转换为Big-Endian。我的困惑仍然存在,如果java.net和/或java.io和/或java.nioapi单独执行hton(主机到网络)和ntoh(网络到主机)?问题的另一部分仍然是,“如果我使用USB驱动器将windows文件(little endian)复制到Apple MAC(big endian)会怎么样?”我在文件/头中确定其endian的位置?我想问你的另一个问题是:默认JVM是否使用little endian(与主机相同),那么我必须将InputStream read()或ByteBuffer读取的顺序反转为Big-Endian吗?根据我的经验,我从来没有遇到过这样的情况,因为我总是在Windows世界中,所以假设java自己处理它。请。评论。完全误导的回答。Java对您隐藏了所有这些。你什么都不用做-1@EJP,我也检查了一下,上面的答案看起来更符合java文档。你的最后一个问题没有意义。字符集与endian-ness无关。编辑字符集可消除UTF-8混淆。可以吗。另请参阅我对@TwoThe的评论。谢谢,谢谢你的回答。我认为我可以完全忽略java中的Endianness,因为默认情况下它总是BIG_ENDIAN。我在某个地方读到,对于对延迟敏感的应用程序,即使不是保存交换的关键因素,对Endianness的了解也是有利的。然而,看起来我几乎不用担心。再次感谢。很明显,Java必须在内部使用平台endian ness,例如将寄存器添加到一起,但无法从Java程序中观察到这一点。