ASCII 字符的 Java 十六进制值出错



我在将十六进制值转换为正确的字符值时遇到了一个小问题。 所以我运行了一个 wireshark,每次捕获一个十六进制值。值是这个(在 wireshark 中是原始数据(。

00383700177a0102081c42000000000000018fffffff7f030201000a080000000000000000184802000007080444544235508001000002080104

所以现在我尝试向设备发送相同的命令。我使用此代码将十六进制转换为 ascii

String hex4 = "00383700177a0102081c42000000000000018FFFFFFF7F030201000a080000000000000000184802000007080444544235508001000002080104";
StringBuilder output4 = new StringBuilder();
for (int i =0; i< hex4.length(); i +=2){
String str4 = hex4.substring(i, i+2);
System.out.println(str4);
output4.append((char)Integer.parseInt(str4, 16));
}
bw3.write(output4.toString());
log.info(output4.toString());
bw3.flush();

但现在的问题是..当我在wireshark中捕获自己发送的数据时,我得到这个:

00383700177a0102081c4200000000000001c28fc3bfc3bfc3bf7f030201000a08000000000000000018480200000708044454423550c2800100

为了一些安慰,我的代码发送了错误的 8f 和 ff 数据..

你能帮我解决问题吗? 谢谢!

使用 StringBuilder 和 BufferedWriter 强制从二进制到文本,然后再转换回二进制,但文本转换步骤没有合理的理由。您正在传输的流是纯二进制的,无法正确转换为文本。因此,文本转换步骤会导致流损坏。

不要使用与文本相关的类,并且在处理二进制数据流时坚持使用仅二进制。

您可以使用javax.xml.bind.DatatypeConverter将十六进制转换为 ascii。如在 Java 中将十六进制字符串转换为 ASCII 的答案中所述,您可以调用byte字符来转换十六进制:

String hex4 = "00383700177a0102081c42000000000000018FFFFFFF7F030201000a080000000000000000184802000007080444544235508001000002080104";
byte[] s = DatatypeConverter.parseHexBinary(hex4);
System.out.println(new String(s));

最新更新