0

我收到一个 UDP 数据包(我不知道哪种格式,我认为是 UTF-16 -little endian-),我只知道以下文档。直接从开发者页面:

每个主服务器通过发送 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

我尝试转换为十六进制,但输出非常有趣:

-0000000000000000000000000008cf52df7c08c

转换方法:

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

比我尝试将十六进制转换为字符串(从上面的方法),结果更有趣(对不起,我不能复制粘贴,出了点问题),无论如何用于将十六进制转换为字符串的方法是:

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 -little endian-),我只知道以下文档。

您确实需要找出数据包实际包含的内容。您在问题中发布的数据包内容对我来说没有多大意义,并且似乎与假定的格式不对应。

首先转储字节数组的字节,如下所示:

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 回答