字节顺序 Java/.NET

4
当通过套接字从Java应用程序向C#应用程序发送信息时,字节顺序是否不同?或者我可以只是从C#向Java应用程序发送一个整数并将其读取为整数吗?
(操作系统是否有影响,还是无论实际操作系统如何处理它,Java/.NET都是相同的?)
4个回答

8
这一切都取决于您如何对数据进行编码。如果您将其仅视为原始字节序列,则没有冲突;序列是相同的。当问题在于以(例如)整数的形式解释数据块时,就会涉及到字节序。
任何考虑可移植性的序列化程序都会定义字节序 - 例如,在协议缓冲区(适用于Java和C#)中,无论您的本地硬件如何,都始终使用小端字节序。
如果您手动向流中写入数据,使用基于移位的编码(而不是直接内存复制)将为您提供定义良好的字节序。
如果你使用预制的平台序列化程序,那么你就要受到实现的限制。它可能是大小端安全的,也可能不是(即在两端可能依赖于平台)。例如,.NET的BitConverter类是不安全的-通常被错误地认为是小端,但在某些平台上(特别是在某些硬件上的Mono中)它可能是大端;因此有.IsLittleEndian属性。
我的建议是使用一个可以为你处理一切的序列化程序;P

3
在Java中,您可以使用读取和写入高字节优先的DataInputStreamDataOutputStream,如文档所述:http://download.oracle.com/javase/6/docs/api/java/io/DataOutputStream.html#writeInt%28int%29。您应该查看相应的C#文档以了解它的作用(或者也许这里有人可以告诉您)。
在Java中,您还可以选择使用ByteBufferhttp://download.oracle.com/javase/6/docs/api/java/nio/ByteBuffer.html,它具有“order”方法,允许您为读取多字节原始类型的操作指定字节顺序。

3

Java在一些库(如DataInput/OutputStream)中使用大端字节序。IP协议都使用大端字节序,这可能会导致人们将大端字节序作为网络协议的默认设置。

然而,NIO和ByteBuffer允许您指定BigEndian、LittleEndian或NativeEndian(系统默认使用的字节序)

x86系统倾向于使用小端字节序,因此许多Microsoft/Linux应用程序默认使用小端字节序,但可以支持大端字节序。


0

是的,字节顺序可能会不同。C# 假定小端序 可能会使用平台的字节顺序,而Java则倾向于使用大端序。这在SO上曾经讨论过。例如,请参见C# little endian or big endian?


1
C# 不做这样的假设;有一些字节级别的实用工具(例如 BitConverter),但它们使用平台的字节序,这在某些平台上可能是不同的。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接