用tcp将double从java发送到C#

用tcp将double从java发送到C#,java,c#,.net,sockets,tcp,Java,C#,.net,Sockets,Tcp,我有一个Java SocketServer,它向C#客户机发送双倍数据。服务器使用DataOutputStream.writeDouble()发送double,客户端使用binarydreader.ReadDouble()读取double。 当我发送dos.writeDouble时(0.123456789)并从服务器刷新,客户端读取并输出3.1463026401+151,这与我发送的不同。 C#和Java双精度编码是否不同 在Java中,DataOutputStream.writeDouble(

我有一个Java SocketServer,它向C#客户机发送双倍数据。服务器使用
DataOutputStream.writeDouble()
发送double,客户端使用
binarydreader.ReadDouble()
读取double。 当我发送
dos.writeDouble时(0.123456789)
并从服务器刷新,客户端读取并输出3.1463026401+151,这与我发送的不同。
C#和Java双精度编码是否不同

在Java中,
DataOutputStream.writeDouble()
在发送前将double转换为a,首先写入高位字节(Big-endian)

但是,C#,
BinaryReader.ReadDouble()
以小尾端格式读取

换句话说:字节顺序不同,更改其中一个应该可以解决问题

在Java中,将字节顺序从大字节改为小字节的最简单方法是使用ByteBuffer,您可以在其中指定Endian类型:例如:

ByteBuffer buffer = ByteBuffer.allocate(yourvaluehere); 
buffer.order(ByteOrder.LITTLE_ENDIAN); 
// add stuff to the buffer
byte[] bytes = buffer.array();

然后,使用
DataOutputStream.write()

事实上,问题在于编码。Java使用big-endian格式,这是标准的网络端,而您的C#客户机使用的是little-endian格式

发生的情况如下:
0.123456789
以IEEE754双精度格式存储为
0x3FBF9ADD379635F
。在C#中读取时,字节顺序被切换,因此它存储为
0x5F633937DD9ABF3F
。这对应于十进制数
3.1463024616909969143315814746e151


看看questing,看看C#客户端的字节顺序是如何颠倒的

两者都应该是IEEE754,但字节顺序可能不同。不过,我不太清楚C#,谢谢你的解释