我编写了一个java程序,它只接收通过UDP套接字发送的数据并将其打印到屏幕上。收到的数据是从另一台使用matlab发送数据的计算机发送的。我很确定matlab仿真很好,因为它所做的只是采用双数据类型的常量值2,使用字节打包器打包数据并通过UDP块将其发送到指定的IP地址和端口。我同时在另一台PC上运行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);
}
}
}
答案 0 :(得分:1)
根据规范,您的代码是正确的,但Matlab正在向您发送0x0200000000000000
(或更短的内容:见下文)。作为double
的2.0的big-endian表示形式为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();
没有缓冲区下溢。包装缓冲区的方式是忽略数据报长度,因此无法判断它们是发送一个,两个,四个还是八个字节。