Отправьте значение с плавающей точкой, используя сокеты (из приложения Java в C#) - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь отправить значения с плавающей точкой из сокета в Java и хочу получить их через сокеты в C#. Код, который я использую, можно увидеть ниже. Проблема, с которой я сталкиваюсь, заключается в том, что значение, полученное на C#, не имеет смысла. Например, если я посылаю 2.3f в виде числа с плавающей точкой из java, полученное мной значение на конце 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.

1 Ответ

3 голосов
/ 18 марта 2020

Я понял, в чем проблема. Для всех, кто заинтересовался, проблема заключалась в порядке байтов. BitConverter в C# использовал LittleEndian (выясняется с помощью BitConverter.isLittleEndian), тогда как DataOutputStream из Java использует BigEndian (я нашел это в в этом посте , ища ответ). Таким образом, я перевернул порядок байтов в C#, и теперь все отлично работает:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...