通过套接字将信息从java应用程序发送到C#应用程序时,字节顺序是否不同?或者我可以只将C#中的整数发送到java应用程序并将其读取为整数吗?
(操作系统是否重要,或者无论实际操作系统如何处理它,对于java / .net都是一样的?)
答案 0 :(得分:8)
这一切都取决于您如何编码数据。如果您将 仅 视为原始字节序列,则不存在冲突;顺序是一样的。当将数据块解释为(例如)整数时,当事务处于字节序时。
任何序列化程序 以可移植性编写 都将定义字节序 - 例如,在协议缓冲区(可用于Java和C#)中始终使用little-endian <强大>无论你的本地硬件。
如果您正在手动写入流,使用基于移位的编码(而不是直接内存复制)之类的东西将为您提供定义的字节顺序。
如果您使用预先安装的平台序列化程序,那么您将受到实施的支配。它可能是endian-safe,也可能不是(即它可能取决于两端的平台)。例如,.NET BitConverter
类不安全 - 它通常被假设(错误地)为little-endian,但在某些平台上(特别是在某些硬件上的Mono)它可能是大端的;因此.IsLittleEndian
属性。
我的建议是使用一个处理它的序列化程序; p
答案 1 :(得分:3)
在Java中,您可以使用首先读取和写入高字节的DataInputStream
或DataOutputStream
,如下所示:
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?