有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用tcp将double从java发送到C#

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


共 (2) 个答案

  1. # 1 楼答案

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

    然而,C#,BinaryReader.ReadDouble()以小端格式读取

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

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

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

    然后,使用DataOutputStream.write()

  2. # 2 楼答案

    问题实际上与编码有关,特别是endianness。Java使用big-endian格式,这是标准的网络endian格式,而C#client使用的是little-endian格式

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

    请看this查询,了解如何在C#客户端反转字节顺序