我收到一个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")));
}
比我尝试将十六进制转换为字符串(来自上面的方法)并且结果更有趣(抱歉我无法复制粘贴,出错了),无论如何用于将十六进制转换为字符串的方法是:< / p>
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数据包拆分成片段还是......?
答案 0 :(得分: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]);
}
然后将其与文档中的预期格式进行比较。如果它们匹配(或多或少),那么您可以开始决定如何提取所需数据的问题。否则,您首先需要弄清楚REALLY的格式是什么。也许我们可以提供帮助......但是我们需要一个可靠的数据包呈现(例如,按照上面的方式生成)。
FWIW,你得到-0000000000000000000000000008cf52df7c08c
的原因是(我认为)BigInteger(byte[])
正在将字节数组解释为签名的号码。无论如何,这不是一个好方法。 UDP数据包主体是一个字节序列,而不是数字。
我还认为UDP数据包不太可能是UTF-16。因此在官方Unicode代码图表中描述了FFFF:
Noncharacters:
这些代码仅供流程内部使用,但不允许进行交换。 [...]
FFFF:•保证值FFFF不是所有
的Unicode字符
因此,如果有人声称这是UTF-16,则使用违反了Unicode标准。