ソケットで受け取るDatagramPacketを解析しようとしています。受信するパケットの形式であるDHCPREQUESTパケットは知っていますが、それはそれほど重要ではないと思います。簡単にするために、最初の6つのフィールドについて考えてみましょう。
最初のフィールドは「オペコード」で、1バイトです。
2番目のフィールドは1バイトの「ハードウェアタイプ」です。
第三に、「ハードウェアアドレスの長さ」、1バイト。
第四に、「ホップ」、1バイト。
5番目、「トランザクション識別子xid」、4バイト。
6番目、「秒」、2バイト。
パケットを受け取った後、私のアプローチはそれをバイト配列に変換することです。
DatagramPacket request = new DatagramPacket(new byte[1024], 1024);
socket.receive(request);
byte[] buf = request.getData();
この時点で、パケットはbuf
一連のバイトとしてバイト配列に格納されます。このバイトシーケンスの構造がわかっているので、どうすれば解析できますか?1バイトのフィールドは十分に単純ですが、マルチビットのフィールドはどうでしょうか。たとえば、バイト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のバイト配列に同様の方法はありますか?
それとも私はどういうわけか自分自身のために物事を難しくしていますか?