【问题标题】:Byte Order Conversion in Java for Network and Host orderJava中用于网络和主机顺序的字节顺序转换
【发布时间】:2013-10-23 13:15:09
【问题描述】:

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

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

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

【问题讨论】:

  • 你的最后一个问题没有意义。字符集与字节序无关。
  • 已编辑以消除 UTF-8 混淆。你能请。还可以看到我的 cmets 到 @TwoThe。谢谢。

标签: java encoding network-programming endianness


【解决方案1】:

这个话题很简单,但我可能在这里有点困惑。网络字节顺序是 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 使用 big-endian。请参阅 Javadoc。

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

Java 中没有。

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

默认情况下已经发生了。

就字节序而言,对于默认文件格式,例如在 Windows 上,它始终为小字节序。

不,不是。见上文。

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

见上文。没必要。

【讨论】:

  • 感谢您的回答。我想我可以完全忽略 java 中的字节顺序,因为它默认总是 BIG_ENDIAN。我在某处读到,对于延迟敏感的应用程序,如果对保存交换不是至关重要的话,对字节顺序的认识是有利的。但是,看起来我几乎不必担心它。再次感谢。
  • 很明显,Java 必须在内部使用平台字节序,当推送来临时,例如将寄存器加在一起,但无法从 Java 程序中观察到这一点。
【解决方案2】:

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

【讨论】:

  • 感谢您的回答。因此,JVM,除了编写类,将使用与默认操作系统相同的字节序,所以我现在明白,无论发送/接收,网络字节顺序都应该首先转换为大字节序。我的困惑仍然存在,如果 java.net 和/或 java.io 和/或 java.nio API 自己执行 hton(host to network) 和 ntoh(network to host)?问题的另一部分仍然是,“如果我使用 USB 驱动器将 Windows 文件(小端序)复制到 Apple MAC(大端序)怎么办?”我在哪里确定文件/标题的字节序?
  • 我想问你的另一个问题是:如果默认 JVM 使用的是 Little-Endian(与主机相同),那么我是否必须颠倒 InputStream read() 的顺序或ByteBuffer 读取到 Big-Endian?根据我的经验,我没有任何必须这样做的实例,因为我总是在 Windows 世界中,所以假设 java 自己处理它。请。评论。
  • 完全误导的答案。 Java 对您隐藏了所有这些。您无需对此做任何事情。 -1
  • @EJP,我也一直在检查这个问题,你上面的答案看起来更符合 java doc。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2015-06-28
  • 1970-01-01
  • 2023-03-11
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多