我有一个小问题,无法将十六进制值转换为正确的char值。 因此,我运行了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数据..
您能帮我解决问题吗? 谢谢 !
答案 0 :(得分:0)
使用StringBuilder和BufferedWriter会强制从二进制转换为文本,然后再转换为二进制,但是没有合理的理由进行文本转换步骤。您传输的流是纯二进制的,无法正确转换为文本。因此,文本转换步骤会导致流损坏。
在处理二进制数据流时,请勿使用与文本相关的类,并且仅使用二进制。
答案 1 :(得分:-1)
您可以使用javax.xml.bind.DatatypeConverter
将十六进制转换为ascii。如对this的回复Convert a String of Hex into ASCII in Java所述,您可以调用byte
char来转换十六进制:
String hex4 = "00383700177a0102081c42000000000000018FFFFFFF7F030201000a080000000000000000184802000007080444544235508001000002080104";
byte[] s = DatatypeConverter.parseHexBinary(hex4);
System.out.println(new String(s));