用tcp将double从java发送到C#
我有一个Java SocketServer,它向C#客户机发送双倍数据。服务器用DataOutputStream.writeDouble()
发送双精度码,客户端用BinaryReader.ReadDouble()
读取双精度码。
当我发送dos.writeDouble(0.123456789);
并从服务器刷新它时,客户端读取并输出3.1463024601691E+151,这与我发送的不同。
C#和Java双精度编码是否不同
你可以在下面搜索框中键入要查询的问题!
我有一个Java SocketServer,它向C#客户机发送双倍数据。服务器用DataOutputStream.writeDouble()
发送双精度码,客户端用BinaryReader.ReadDouble()
读取双精度码。
当我发送dos.writeDouble(0.123456789);
并从服务器刷新它时,客户端读取并输出3.1463024601691E+151,这与我发送的不同。
C#和Java双精度编码是否不同
# 1 楼答案
在Java中,
DataOutputStream.writeDouble()
在发送之前将double转换为a,首先写入高位字节(Big-endian)然而,C#,
BinaryReader.ReadDouble()
以小端格式读取换句话说:字节顺序不同,更改其中一个应该可以解决问题
在Java中,将字节顺序从大字节改为小字节的最简单方法是使用字节缓冲符,在字节缓冲符中可以指定字节类型:例如:
然后,使用
DataOutputStream.write()
# 2 楼答案
问题实际上与编码有关,特别是endianness。Java使用big-endian格式,这是标准的网络endian格式,而C#client使用的是little-endian格式
下面是发生的情况:
0.123456789
以IEEE754双精度格式存储为0x3FBF9ADD3739635F
。在C#中读取时,字节顺序被切换,因此它被存储为0x5F633937DD9ABF3F
。这对应于十进制数3.14630264016909969143315814746e151
请看this查询,了解如何在C#客户端反转字节顺序