Отправить расширенный ascii через сокет Java - PullRequest
0 голосов
/ 24 августа 2018

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

Теперь я делю поток и преобразую каждые 2 цифры в символ.Вывод этого я преобразую обратно в строку, чтобы я мог отправить данные.Для отладки я использую wireshark, чтобы проверить, верны ли отправленные данные.

Но это не правильно.И я знаю почему.Потому что, например, я использую b7 (декабрь 183), а char поддерживает только до 127. Но теперь проблема в том, что я не знаю, как решить проблему ..

Можете ли вы помочь исправить мой код?Спасибо !

ServerSocket welcomeSocket2 = new ServerSocket(9999);
   Socket socket2 = welcomeSocket2.accept();  
   OutputStream os3 = socket2.getOutputStream();
   OutputStreamWriter osw3 = new OutputStreamWriter(os3);
   BufferedWriter bw3 = new BufferedWriter(osw3);



String hex4 = "00383700177a01020a6cb7000000000000018fffffff7f030201000a080000000000000000184802000007080444544235508001000002080104";

   StringBuilder output4 = new StringBuilder();
   for (int i =0; i< hex4.length(); i +=2){
       String str4 = hex4.substring(i, i+2);
       int outputdecimal = Integer.parseInt(str4,16);
       char hexchar = (char)outputdecimal;
       System.out.println(str4);
       output4.append(hexchar);
   }

 bw3.write(output4.toString());

Вот что я получаю в Wireshark:

0000   00 38 37 00 17 7a 01 02 0a 6c c2 b7 00 00 00 00
0010   00 00 01 c2 8f c3 bf c3 bf c3 bf 7f 03 02 01 00
0020   0a 08 00 00 00 00 00 00 00 00 18 48 02 00 00 07
0030   08 04 44 54 42 35 50 c2 80 01

Но правильные данные, которые я должен получить в Wireshark, таковы:

0000   00 38 37 00 17 7a 01 02 0a 6c b7 00 00 00 00 00
0010   00 01 8f ff ff ff 7f 03 02 01 00 0a 08 00 00 00
0020   00 00 00 00 00 18 48 02 00 00 07 08 04 44 54 42
0030   35 50 80 01 00 00 02 08 01 04

1 Ответ

0 голосов
/ 25 августа 2018

В качестве альтернативы, если вы хотите записать байты в сокет, вы можете сделать это напрямую, а не с дополнительными соглашениями о кодировке символов и преобразованиях в текст и из текста.

В Java нет неподписанных байтов.Тем не менее, byte[] часто используется для передачи необработанных данных.

Пример данных:

byte[] data = { 0x00, 0x01, 0x7f, (byte)0x80, (byte)0xfe, (byte)0xff };

(В Java нет литералов byte. Значения литералов приводятся от int до byte, используя синтаксис преобразования для переопределения компиляторапроверка диапазона, где это необходимо.

FilterOutputStream имеет удобный метод записи байтового массива в выходной поток.

ServerSocket welcomeSocket2 = new ServerSocket(9999);
Socket socket2 = welcomeSocket2.accept();  
OutputStream os3 = socket2.getOutputStream();

FilterOutputStream out = new FilterOutputStream(os3);
out.write(data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...