TCP Socket дает неверное значение - PullRequest
1 голос
/ 02 ноября 2010

Я использую TCP Socket в своем проекте Java.Я пытаюсь получить данные от некоторого оборудования.Когда устройство отправляет данные от 0x80 до 0x9f, данные повреждаются.Например, если устройство отправляет 0x86 (десятичное число 134), я получаю 0x2020 (десятичное число 8224).Ниже приведен пример кода

BufferedReader in = new BufferedReader(
                    new InputStreamReader(
                    socket.getInputStream()));

          int res = in.read() ;

Пожалуйста, дайте мне знать, если кто-нибудь сталкивался с такой проблемой.Любая помощь высоко ценится.

Aj

Ответы [ 2 ]

2 голосов
/ 02 ноября 2010

InputStreamReader читает байты и преобразует их в символы (обычно используя UTF-8, если не указано иное). И UTF-8 говорит, что байты со значениями более 127 являются частью многобайтового символа, поэтому они могут быть объединены со следующим байтом и дать вам странный код символа. Другие кодировки могут делать такие же странные вещи, если предположить, что ваши байты представляют символы, определенные в наборе символов кодировки.

Исправление: если вы читаете байты, читайте байты (через InputStream). Если вы читаете символы, читайте символы (через Reader). Никогда не путайте их.

2 голосов
/ 02 ноября 2010

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

Вы действительно пытаетесь отправить и получить текст? Если это так, явно используйте одну и ту же кодировку с обеих сторон (и убедитесь, что она охватывает весь текст, который вы хотите передать - UTF-8 обычно хорошая ставка). Если нет, вообще не используйте пару Writer / Reader - они предназначены для текстовых данных.

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