1

Я пытаюсь отправить определенное шестнадцатеричное значение через последовательный COM-порт, используя PuTTY. В частности, я хочу отправить шестнадцатеричные коды 9C, B6, FC и 8B. Я посмотрел коды Alt для них, и они 156, 182, 252 и 139 соответственно.

Однако всякий раз, когда я вводю Alt- коды, перед 9C, B6 и 8B передается предыдущее шестнадцатеричное значение C2, поэтому отправляются значения C2 9C, C2 B6 и C2 8B. Значение для FC изменено на C3 FC.

Почему эти значения помещаются перед шестнадцатеричным значением и почему FC изменяется полностью? Мне кажется, что существует проблема с внутренним преобразованием кода Alt в шестнадцатеричный код. Есть ли способ прямого ввода шестнадцатеричных значений без использования Alt- кодов в PuTTY?

1 ответ1

4

То, что вы видите, - это обычное преобразование текстового набора символов.

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

Другими словами, когда вы набираете Alt+1 8 2, PuTTY получает соответствующий символ из устаревшей кодировки "OEM", для которой настроена система. (Нажатие Alt+0 1 8 2 выберет из устаревшего набора символов "ANSI" (Windows-125x).) В этом случае, персонаж , крылатка.

Теперь PuTTY должен преобразовать этот символ в байты. В более ранних версиях PuTTY по умолчанию использовался тот же устаревший набор символов Windows-125x, который используется самой ОС, например, Windows-1257, поэтому раньше преобразование было почти прямым: ввод 1 8 2, получение десятичного байта 182 (0xB6 hex).

Однако, поскольку PuTTY обычно подключается к серверам Linux или BSD, подавляющее большинство из которых перешли на UTF-8 по умолчанию, последний выпуск PuTTY также начал использовать UTF-8 по умолчанию. UTF-8 является кодировкой мегасимвола Unicode, который имеет в позиции U+00B6, и в основном это просто совпадение, что UTF-8 кодирует это значение как байты C2 B6:

  • U+00B60000|0000 10|110110[110]00010 [10]110110C2 B6

  • U+00FC0000|0000 11|111100[110]00011 [10]111100C3 BC

  • U+20AC0010|0000 10|101100[1110]0010 [10]000010 [10]101100E2 82 AC

  • В Википедии есть это с цветами

В качестве другого примера, буква ė раньше была байтом E6 в кодировке Windows-1257, но в Unicode это U+0117, что соответствует байтам C4 97 в UTF-8. Эти последовательности имеют переменную длину, до 4 байтов для больших позиций.

Если вам абсолютно необходимо использовать PuTTY для отправки двоичных данных, откройте экран настроек «Окно → Перевод» и выберите в качестве "Удаленного набора символов" CP437, ISO-8859-1 или Windows-1252. (Сохраните это в отдельном сеансе; не сохраняйте это как глобальное значение по умолчанию, потому что это нарушит обычные соединения SSH.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .