шестнадцатеричное значение java для символа ascii - PullRequest
0 голосов
/ 26 июня 2018

У меня небольшая проблема, чтобы преобразовать шестнадцатеричное значение в правильное значение символа. Поэтому я запустил проволочную акулу и каждый раз ловил шестнадцатеричное значение. Значение было этим (в 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 ..

Можете ли вы помочь мне решить проблему? Спасибо !

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Вы можете использовать javax.xml.bind.DatatypeConverter для преобразования вашего шестнадцатеричного в ascii. Как упоминалось в этом ответе на Преобразование строки шестнадцатеричного кода в ASCII в сообщении Java , вы можете вызвать byte char для преобразования шестнадцатеричного кода:

String hex4 = "00383700177a0102081c42000000000000018FFFFFFF7F030201000a080000000000000000184802000007080444544235508001000002080104";
byte[] s = DatatypeConverter.parseHexBinary(hex4);
System.out.println(new String(s));
0 голосов
/ 26 июня 2018

Использование StringBuilder и BufferedWriter вызывает преобразование из двоичного файла в текстовый, а затем обратно в двоичный, но для шага перехода текста нет рациональной причины.Передаваемый вами поток является чисто двоичным и не может быть правильно преобразован в текст.Из-за этого шаг преобразования текста приводит к повреждению потока.

Не используйте текстовые классы и придерживайтесь только двоичного кода, когда имеете дело с двоичными потоками данных.

...