gpt4 book ai didi

java - 使用套接字发送浮点值(从 Java 应用程序到 C#)

转载 作者:行者123 更新时间:2023-12-01 19:28:15 24 4
gpt4 key购买 nike

我正在尝试从 Java 中的套接字发送浮点值,并希望通过 C# 中的套接字接收它们。我正在使用的代码如下所示。我面临的问题是,在 C# 上收到的值没有意义。例如,如果我从 java 发送 2.3f 作为 float ,则我在 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 时。

最佳答案

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

关于java - 使用套接字发送浮点值(从 Java 应用程序到 C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60742595/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com