【发布时间】:2012-05-27 12:49:26
【问题描述】:
我正在尝试解析我将在套接字处收到的 DatagramPacket。我知道我将收到的数据包的格式,即 DHCPREQUEST 数据包,但我认为这并不重要。为简单起见,我们只考虑前六个字段:
第一个字段是“操作码”,为 1 个字节。
第二个字段是 1 个字节的“硬件类型”。
三、“硬件地址长度”,1字节。
四、“跳”,1个字节。
五、“交易标识xid”,4字节。
第六,“秒”,2个字节。
收到数据包后,我的做法是转成字节数组。
DatagramPacket request = new DatagramPacket(new byte[1024], 1024);
socket.receive(request);
byte[] buf = request.getData();
此时,数据包作为一系列字节存储在字节数组buf中。既然我知道这个字节序列的结构是什么,那我该如何解析呢?一字节字段很简单,但是多位字段呢?例如,如何提取字节 4 到 7,并将它们存储在名为 xid 的变量中?
我可以手动将每个字节放入一个数组中:
byte[] xid = new byte[4];
xid[0] = buf[4];
xid[1] = buf[5];
xid[2] = buf[6];
xid[3] = buf[7];
但这对于数百字节长度的字段来说非常乏味且不切实际。 String 类可以解析给定偏移量和长度的子字符串; Java中的字节数组有类似的方法吗?
还是我以某种方式为难自己?
【问题讨论】:
-
为什么不使用 TCP/IP 而不是 UDP?它允许更好的使用机制...
-
@Thihara:DHCP 使用 UDP 作为其传输协议。我决定使用 UDP 来模拟实际 DHCP 服务器的行为。
-
虽然我不知道为什么 DHCP 不使用 TCP,这似乎是一个更可靠的协议。但我知道什么……哈哈。
-
@Terribad - 这是因为 DHCP 是一种轻量级协议,它不需要可靠的字节流语义以及所需的所有网络数据包和本地资源开销。 (查看 TCP 规范,计算启动和关闭连接所需的网络数据包。)
标签: java parsing udp bytearray