如何获取通过网络接收的double类型的UDP数据包数据?

How do I obtain UDP packet data with double type that is received over a network?

我编写了一个 java 程序,它只接收通过 UDP 套接字发送的数据并将其打印到屏幕上。接收到的数据是从另一台使用 matlab 发送数据的计算机发送的。我很确定 matlab 模拟很好,因为它所做的只是采用双精度数据类型的常量值 2,使用字节打包器打包数据并通过 UDP 块将其发送到指定的 IP 地址和端口。我同时 运行 另一台电脑上的 java 代码接收数据包作为长度为 1024 的字节数组。

数据接收正常,但是不断打印的值为

4.7783097267364807 E -299。

我不确定我的代码是否正确地从数据包中获取了所需的数据,或者是否正确使用了 ByteBuffer.wrap(.....).getDouble() 函数。任何帮助将不胜感激

 import java.io.*;
 import java.net.*;
 import java.nio.ByteBuffer;

class receiver
{
   public static void main(String args[]) throws Exception
      {
         DatagramSocket serverSocket = new DatagramSocket(1024);
            byte[] receiveData = new byte[1024];
            byte[] sendData = new byte[1024];
            System.out.println("Listening...");

            while(true)
               {
                  DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                  serverSocket.receive(receivePacket);
                  double data = ByteBuffer.wrap(receiveData).getDouble();
                  System.out.println(data);
               }
      }
}

根据规范,您的代码是正确的,但 Matlab 向您发送 0x0200000000000000(或更短的内容:见下文)。 2.0 的大端表示 double0x4000000000000000,因此他们肯定不会向您发送 double.

要从他们实际发送给您的内容中获取 2,请执行以下操作:

ByteBuffer  bb = ByteBuffer.wrap(receivePacket.getData(), 0, receivePacket.getLength());
bb.order(ByteOrder.LITTLE_ENDIAN);

然后按此顺序分别尝试以下操作,直到一个有效:

long l = bb.getLong();
int i = bb.getInt();
short s = bb.getShort();
byte b = bb.getByte();

没有缓冲区下溢。包装缓冲区的方式忽略了数据报长度,因此无法判断它们发送的是一字节、二字节、四字节还是八字节。