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

我如何读入这些数据?

        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

        }

我将如何存储这些数据?

最佳答案

DatagramPacket 的 getData以 byte[] 形式返回有效负载。您可以使用 Arrays.copyOfRange获取各个字段(我假设您在问题中指的是 bytes,而不是 bits):

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 的类型都是签名,而在许多通信协议(protocol)中使用未签名的实体,所以在这一步中要小心。

您的问题中未提及但您稍后可能需要它:组装消息以进行传输。我喜欢用 GNU Trove's TByteArrayList对于该任务,因为您无需担心在开始之前保留具有正确长度的字节 [],只需复制字节或消息段,完成后调用 toArray瞧,您的 byte[] 已准备好传输。

关于Java如何解析UDP数据包中的原始数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13713699/

相关文章:

java - 在synchronized block 中使用Object.class锁有什么影响?

java - Spring MVC : How do I store an application scoped key-value map (considering thread-safety)?

java - 在 `Collection <MyObject>` 内部和外部 `MyObject` 类之间进行选择 [Java]

c - Udp readfrom直到结束

ssl - 服务器设计: Send UDP packet for SSLTCP wakeup?

java - Java中的UDP编程

具有多个用户的 C# UDP 服务器

python - 反序列化 C 数据

java - 从 GAE 队列发送 HTTP 请求

java - 请任何人帮助我连接主要 Activity 和适配器类。