我有一個小問題,無法將十六進制值轉換為正確的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會強制從二進制轉換為文本,然后再轉換為二進制,但是沒有合理的理由進行文本轉換步驟。您傳輸的流是純二進制的,無法正確轉換為文本。因此,文本轉換步驟會導致流損壞。
在處理二進制數據流時,請不要使用與文本相關的類,而只能使用二進制。

人到中年有點甜
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));
添加回答
舉報
0/150
提交
取消