Java如何解析UDP数据包中的原始数据
我假设数据来自二进制形式的UDP连接 它由5个字段组成,大小为25位 它们的偏移量如下所示Java如何解析UDP数据包中的原始数据,java,udp,Java,Udp,我假设数据来自二进制形式的UDP连接 它由5个字段组成,大小为25位 它们的偏移量如下所示 1. 0-4 ID 2. 5-10 payload 3. 11-12 status 4. 13-23 location 5. 23-25 checksum 如何读取这些数据 如何存储这些数据?DatagramPacket以字节[]的形式返回有效负载。您可以使用来获取各个字段,我假设您的问题中指的是字节,而不是位: 在这一步之后,您将把字段作为单独的字节数组,可能需要一些后处理/重新组装成其他类
1. 0-4 ID
2. 5-10 payload
3. 11-12 status
4. 13-23 location
5. 23-25 checksum
如何读取这些数据
如何存储这些数据?DatagramPacket以字节[]的形式返回有效负载。您可以使用来获取各个字段,我假设您的问题中指的是字节,而不是位:
在这一步之后,您将把字段作为单独的字节数组,可能需要一些后处理/重新组装成其他类型。在这一步中,最烦人的可能是所有Java类型都是有符号的,而在许多通信协议中使用的是无符号实体,所以在这一步中要小心
您的问题中没有提到,但稍后可能需要:用于传输的消息集合。我喜欢使用它来完成这项任务,因为在开始之前,您不必担心保留一个长度正确的字节[],只需复制字节或消息段,一旦完成调用,您的字节[]就可以传输了。DatagramPacket将有效负载作为字节[]返回。您可以使用来获取各个字段,我假设您的问题中指的是字节,而不是位:
在这一步之后,您将把字段作为单独的字节数组,可能需要一些后处理/重新组装成其他类型。在这一步中,最烦人的可能是所有Java类型都是有符号的,而在许多通信协议中使用的是无符号实体,所以在这一步中要小心
您的问题中没有提到,但稍后可能需要:用于传输的消息集合。我喜欢使用它来完成这项任务,因为在开始之前,您不需要担心保留一个具有正确长度的字节[],只需复制字节或消息分段,一旦完成,就可以调用并查看您的字节[]已准备好传输。您还需要考虑DatagramPacket中的getOffset和getLength。@EJP不确定您的意思-getData以数组的形式获取电报的有效负载,如果您使用ByteArrayInputStream路由,getOffset和getLength很重要-我在本文中没有提到这一点example@fvu非常感谢。这是非常有用的!如何将有效负载解析为人类可读的字符串?您还需要考虑DatagramPacket中的getOffset和getLength。@EJP不确定您的意思-getData以数组的形式获取电报的有效负载,如果您使用ByteArrayInputStream路径,则getOffset和getLength非常重要,我在本文中没有提到这一点example@fvu非常感谢。这是非常有用的!如何将有效负载解析为人类可读的字符串?
DatagramSocket serverSocket = new DatagramSocket(18000);
byte[] receiveData = new byte[1024];
while (true)
{
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
//not sure how I should be reading the raw binary data back in
}
while (true) {
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
// get the entire content
byte telegramContent[] = receivePacket.getData();
// and slice it up:
byte ID[] = Arrays.copyOfRange(telegramContent,0,5);
byte payload[] = Arrays.copyOfRange(telegramContent,6,11);
// and so on.
}