如何获取通过网络接收的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 的大端表示 double
是 0x4000000000000000
,因此他们肯定不会向您发送 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();
没有缓冲区下溢。包装缓冲区的方式忽略了数据报长度,因此无法判断它们发送的是一字节、二字节、四字节还是八字节。
我编写了一个 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 的大端表示 double
是 0x4000000000000000
,因此他们肯定不会向您发送 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();
没有缓冲区下溢。包装缓冲区的方式忽略了数据报长度,因此无法判断它们发送的是一字节、二字节、四字节还是八字节。