1

バイナリ形式の 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

        }

このデータをどのように保存しますか?

4

1 に答える 1

4

DatagramPacket のgetDataはペイロードを byte[] として返します。Arrays.copyOfRangeを使用して個々のフィールドを取得できます (質問では、bitsではなくbytesを意味していると思います):

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の TByteArrayListを使用するのが好きです。開始する前に byte[] を正しい長さで予約することを心配する必要がないためです。あなたのバイト[]は送信の準備ができています。

于 2012-12-04T23:29:30.363 に答える