【问题标题】:Send a float value using sockets (from Java application to C#)使用套接字发送浮点值(从 Java 应用程序到 C#)
【发布时间】:2020-06-29 17:27:22
【问题描述】:

我正在尝试从 Java 中的套接字发送浮点值,并希望通过 C# 中的套接字接收它们。我正在使用的代码如下所示。我面临的问题是,在 C# 上收到的值没有意义。例如,如果我从 java 发送 2.3f 作为浮点数,我在 C# 端收到的值是 8.96831E-44。我似乎无法理解这一点。任何帮助将不胜感激。

---------Java代码----

            ServerSocket serverSocket = new ServerSocket(4343, 10);
            Socket socket = serverSocket.accept();         
            OutputStream os = socket.getOutputStream();

            // Receiving part which I used from another tutorial,
            // Below part is just to check if send and receive are working 

            byte[] lenBytes = new byte[4];
            is.read(lenBytes, 0, 4);
            int len = (((lenBytes[3] & 0xff) << 24) | ((lenBytes[2] & 0xff) << 16) |
                    ((lenBytes[1] & 0xff) << 8) | (lenBytes[0] & 0xff));
            byte[] receivedBytes = new byte[len];
            is.read(receivedBytes, 0, len);
            String received = new String(receivedBytes, 0, len);

            System.out.println("Server received: " + received);

            // Sending, the crucial part
            DataOutputStream out = new DataOutputStream(socket.getOutputStream());
            out.writeFloat(2.3f);
            socket.close();
            serverSocket.close();

-------------C#代码------------

            string toSend = "Hello!";

            IPEndPoint serverAddress = new IPEndPoint(IPAddress.Parse(myIP), 4343);

            Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            clientSocket.Connect(serverAddress);

            // Sending
            int toSendLen = System.Text.Encoding.ASCII.GetByteCount(toSend);
            byte[] toSendBytes = System.Text.Encoding.ASCII.GetBytes(toSend);
            byte[] toSendLenBytes = System.BitConverter.GetBytes(toSendLen);
            clientSocket.Send(toSendLenBytes);
            clientSocket.Send(toSendBytes);

            // Receiving
            byte[] rcvLenBytes = new byte[32];
            int k = clientSocket.Receive(rcvLenBytes);
            // this line i followed from another post
            float val= System.BitConverter.ToSingle(rcvLenBytes, 0);


            Console.WriteLine(val);

            clientSocket.Close();
            Console.ReadLine();

谢谢!

编辑:使用套接字在 java 和 C# 之间传递整数工作得很好,我正面临这个问题,尤其是 float 和 double。

【问题讨论】:

  • 让您的生活更轻松并发送 json 或 XML。不是二进制的。
  • 但无论如何:您是否检查过这是否只是字节序问题?
  • Java float 和 C# single 都符合 IEEE754,所以应该有一个漏洞隐藏在某处......
  • 我以前见过这个,这是一个字节序问题。
  • k 的值是多少,rcvLenBytes 包含哪些非零字节?

标签: java c# sockets


【解决方案1】:

我意识到问题所在。对于任何感兴趣的人来说,问题是字节序。 C# 中的 BitConverter 使用 LittleEndian(通过使用 BitConverter.isLittleEndian 发现),而 Java 中的 DataOutputStream 使用 BigEndian(我在寻找答案时在this post 上发现了这个)。所以我在 C# 中翻转了字节顺序,现在一切正常:)

【讨论】:

  • 很高兴您对它进行了排序。这些事情可能会很痛苦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-08
  • 1970-01-01
相关资源
最近更新 更多