字节顺序java / .net

时间:2011-05-14 08:43:38

标签: c# java sockets

通过套接字将信息从java应用程序发送到C#应用程序时,字节顺序是否不同?或者我可以只将C#中的整数发送到java应用程序并将其读取为整数吗?

(操作系统是否重要,或者无论实际操作系统如何处理它,对于java / .net都是一样的?)

4 个答案:

答案 0 :(得分:8)

这一切都取决于您如何编码数据。如果您将 视为原始字节序列,则不存在冲突;顺序是一样的。当数据块解释为(例如)整数时,当事务处于字节序时。

任何序列化程序 以可移植性编写 都将定义字节序 - 例如,在协议缓冲区(可用于Java和C#)中始终使用little-endian <强大>无论你的本地硬件。

如果您正在手动写入流,使用基于移位的编码(而不是直接内存复制)之类的东西将为您提供定义的字节顺序。

如果您使用预先安装的平台序列化程序,那么您将受到实施的支配。它可能是endian-safe,也可能不是(即它可能取决于两端的平台)。例如,.NET BitConverter安全 - 它通常被假设(错误地)为little-endian,但在某些平台上(特别是在某些硬件上的Mono)它可能是大端的;因此.IsLittleEndian属性。

我的建议是使用一个处理它的序列化程序; p

答案 1 :(得分:3)

在Java中,您可以使用首先读取和写入高字节的DataInputStreamDataOutputStream,如下所示:

http://download.oracle.com/javase/6/docs/api/java/io/DataOutputStream.html#writeInt%28int%29

您应该检查相应的C#文档以查看它的作用(或者这里有人可以告诉您)。

在Java中,您还可以选择使用ByteByffer

http://download.oracle.com/javase/6/docs/api/java/nio/ByteBuffer.html

...具有“order”方法,允许您为读取多字节基元类型的操作指定字节顺序。

答案 2 :(得分:3)

Java将Big Endian用于某些库,如DataInput / OutputStream。 IP协议都使用Big Endian,这可能导致人们使用Big Endian作为网络协议的默认值。

然而,NIO,ByteBuffer允许您指定BigEndian,LittleEndian或NativeEndian(默认情况下系统使用的任何内容)

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

答案 3 :(得分:0)

是的,字节顺序可能不同。 C#假设little-endian 可能使用平台的字节顺序,Java倾向于使用big-endian。之前已在SO上讨论过这个问题。请参阅示例C# little endian or big endian?