0

UDPパケット(どの形式かはわかりませんが、UTF-16-リトルエンディアン-だと思います)を受信して​​います。私が知っているのは、次のドキュメントだけです。開発者ページから直接:

マスターサーバーはそれぞれ、FF FF FF FF 73 0Aに続いて、(比較的)一意の4バイトの「チャレンジ」番号を送信することで応答します。

だからこれは私がパケットを受信する方法です:

byte[] buff = new byte[64];
DatagramPacket packet = new DatagramPacket(buff, buff.length);
socket.receive(packet);

パケットを受信しました。すべて問題ありませんが、今は行き詰まっています。その4バイト整数が必要です。バッファを分割する必要がありますか...どうしたらよいかわかりません。

受信したデータは次のとおりです。

˙˙˙˙s
Ň?t

16進数に変換しようとしましたが、出力は非常に興味深いものです。

-0000000000000000000000000008cf52df7c08c

変換する方法:

public String toHex(String arg) throws UnsupportedEncodingException {
   return String.format("%040x", new BigInteger(arg.getBytes("UTF-16LE")));
}

(上記の方法で)16進数を文字列に変換しようとした場合、結果ははるかに興味深いものになります(申し訳ありませんが、貼り付けをコピーできません。何か問題が発生します)。とにかく、16進数を文字列に変換するために使用する方法は次のとおりです。

public String hexToString(String hex){
   StringBuilder output = new StringBuilder();
   for (int i = 0; i < hex.length(); i+=2) {
      String str = hex.substring(i, i+2);
      output.append((char)Integer.parseInt(str, 16));
   }

   return new String(output);
}

とはいえ、私は立ち往生しています。どうしたらいいのかわからない。UDPパケットを分割する必要がありますか...?

4

1 に答える 1

1

UDPパケット(どの形式かはわかりませんが、UTF-16-リトルエンディアン-だと思います)を受信して​​います。私が知っているのは、次のドキュメントだけです。

あなたは本当にパケットが実際に何を含んでいるかを知る必要があります。あなたが質問に投稿したパケットの内容は私にはあまり意味がなく、想定された形式に対応していないようです。

次のようにバイト配列のバイトをダンプすることから始めます。

byte[] bytes = ...
int len = // number of bytes read.
for (int i = 0; i < len; i++) {
    System.out.format("%02x ", bytes[i]);
}

次に、それをドキュメントから予想される形式と比較します。それらが(多かれ少なかれ)一致する場合は、必要なデータを抽出する方法を決定する問題から始めることができます。それ以外の場合は、最初にフォーマットが実際に何であるかを理解する必要があります。多分私達は助けることができます...しかし私達はパケットの信頼できるレンダリングを必要とします(例えば上記のように生成されます)。


FWIW、あなたが得ている理由-0000000000000000000000000008cf52df7c08cは(私が思うに)バイト配列を符号付きBigInteger(byte[])数値として解釈しているからです。とにかく、それはこれを行うのに良い方法ではありません。UDPパケット本体は、数値ではなくバイトのシーケンスです。


また、UDPパケットがUTF-16である可能性は低いと思います。したがって、FFFFは公式のUnicodeコードチャートで説明されています。

非文字:

これらのコードはプロセス内部での使用を目的としていますが、交換は許可されていません。[...]

FFFF:•値FFFFは、Unicode文字ではないことが保証されています

したがって、これがUTF-16であると誰かが主張している場合、使用法はUnicode標準に違反しています。

于 2013-02-16T03:48:26.237 に答える