我有来自二进制形式的 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/