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

时间:2012-12-04 23:15:53

标签: 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

如何阅读此数据?

        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

        }

我如何存储这些数据?

1 个答案:

答案 0 :(得分:4)

DatagramPacket的getData将有效负载作为byte []返回。您可以使用Arrays.copyOfRange获取单个字段(我假设您的意思是字节,而不是):

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

在此步骤之后,您将字段作为单个字节数组,可能需要对其他类型进行一些后处理/重组。在这一步骤中,最令人讨厌的是所有Java类型都是签名,而在许多通信协议中使用了无符号实体,因此在此步骤中要小心。

您的问题中没有提到,但您可能稍后需要:汇编消息进行传输。我喜欢使用GNU Trove's TByteArrayList来执行该任务,因为您不需要担心在开始之前保留具有正确长度的byte [],只需复制字节或消息段,并在完成后调用{{ 3}}和voilà,你的byte []已准备好传输。