Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java如何解析UDP数据包中的原始数据_Java_Udp - Fatal编程技术网

Java如何解析UDP数据包中的原始数据

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以字节[]的形式返回有效负载。您可以使用来获取各个字段,我假设您的问题中指的是字节,而不是位: 在这一步之后,您将把字段作为单独的字节数组,可能需要一些后处理/重新组装成其他类

我假设数据来自二进制形式的UDP连接

它由5个字段组成,大小为25位

它们的偏移量如下所示

 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.
}