Разбор байтового массива, отправленного через TCP в Java - PullRequest
0 голосов
/ 19 октября 2018

Я занимаюсь разработкой встроенной системы, которая отправляет некоторые данные по TCP.Эта система основана на ARM, и ее код написан на C. На стороне C у меня есть массив char (или байт без знака, т.е. uint8_t ), который представляет некоторые закодированные данные:

 char buffer[BUFFER_SIZE] = {0, 11, 34,176,255}; // for example.

Этот буфер будет отправлен на сервер по протоколу TCP / IP с использованием популярного модуля GPRS под названием SIM800.Соединение между микроконтроллером и SIM800 является UART, то есть стандартным последовательным соединением.Я могу отправить либо uint8_t или char массив.Он не отличается в мире C.

На стороне сервера существуют некоторые службы Java, которые получают и анализируют этот массив.

Проблема в том, что в языке C типы данных uint8_t и char несколько идентичны, т. Е. 0 -> 255 равны всей таблице ASCII.Но, насколько я знаю, это не так на сервере.В Java byte тип данных имеет внутреннюю подпись, и его диапазон составляет от -128 до 127. Более того, расширенные символы ASCII от 128 до 255 почему-то нестандартны и отличаются от системы к системе.

Служба Java получает данные в виде String , а затем преобразует их в массив байтов.

Я в замешательстве.Что произойдет, если я отправлю вышеупомянутый массив на сервер.Может ли сервис Java переосмыслить это?

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

Вы можете конвертировать байтовый массив в base64 и отправить на сервер Java.Затем служба Java преобразует его обратно в исходный байтовый массив.

0 голосов
/ 19 октября 2018

Проблема в том, что преобразование между символом и байтом в Java не является простым, потому что оно включает в себя кодировку.Кодировка Latin1 или ISO-8859-1 - это прямое преобразование, где младший байт символа является исходным, а старший бит - 0.

Так что вы должны убедиться (это должно быть сказано вдокументация службы Java) как служба преобразует входные байты в строку (что такое используемый набор символов), а затем использует тот же набор символов для обратного преобразования.

Естественным способом было бы использование преобразования Latin1, в этом случае байты Java были бы значением int8_t представления исходного байта uint_t.Таким образом, все байты ниже 128 должны быть неизменными, а байты, начинающиеся с 128, получат original_value - 256.Например, 255 будет -1, а 128 - -128.

0 голосов
/ 19 октября 2018

Вы можете попробовать следующее после чтения байтов из потока TCP

        String str = new String(bytes, 
                                         StandardCharsets.US_ASCII);
...