我有来自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
}
我如何存储这些数据?
答案 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 []已准备好传输。