为了账号安全,请及时绑定邮箱和手机立即绑定

java ascii char的十六进制值出错

java ascii char的十六进制值出错

墨色风雨 2021-04-14 09:30:12
我有一个小问题,无法将十六进制值转换为正确的char值。因此,我运行了Wireshark,每次捕获到一个十六进制值。值就是这个(在wireshark原始数据中)。00383700177a0102081c42000000000000018fffffff7f030201000a080000000000000000184802000007080444544235508001000002080104所以现在我试图将相同的命令发送到设备。我使用此代码将十六进制转换为asciiString 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数据。
查看完整描述

2 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

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

在处理二进制数据流时,请不要使用与文本相关的类,而只能使用二进制。


查看完整回答
反对 回复 2021-04-28
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

您可以使用javax.xml.bind.DatatypeConverter将十六进制转换为ascii。正如提到这个答案转换十六进制的字符串转换成ASCII在Java中后,你可以调用byte字符转换成十六进制:


String hex4 = "00383700177a0102081c42000000000000018FFFFFFF7F030201000a080000000000000000184802000007080444544235508001000002080104";

byte[] s = DatatypeConverter.parseHexBinary(hex4);

System.out.println(new String(s));


查看完整回答
反对 回复 2021-04-28
  • 2 回答
  • 0 关注
  • 224 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信