Преобразование байтов в символы для потока Telnet - PullRequest
2 голосов
/ 28 марта 2012

Я получаю поток байтовых данных из сеанса telnet через TcpClient.GetStream().ReadByte().Затем я преобразовываю эти байтовые данные в ASCII с помощью приведения char.Данные поступают нормально, но с большим количеством лишнего мусора, например 1[01;001H[0k[01.

Кто-нибудь знает, что это за лишний мусор?

ОБНОВЛЕНИЕ Более подробный поток ответов ниже

1 [01; 001H [0K [01; 017H [0; 1; 4mTitle of Here Here] [0; 1m [0; 1m [02; 001H [02; 051H] [0KWed 28 марта 2012 г. 03:03 pm [02; 051HДата времени здесь [0J [03; 001H [0J [23; 001H [0J [0; 1; 7mPrompt Here] [P] - [0; 1m [23; 044H

Когда следует читать

Название страницы здесь Дата Время здесь

Подскажите здесь

1 Ответ

6 голосов
/ 28 марта 2012

Части «мусора», которые вы видите, являются частью протокола Telnet.Пульт дистанционного управления пытается согласовать некоторые параметры с вами, а также может посылать вам некоторые другие команды (хотя на практике это относительно редко).См. TELNET COMMAND STRUCTURE раздел применимого RFC для точного формата и значения всех возможных команд.

В большинстве случаев вы сможете просто игнорировать любые команды Telnet (включаясогласование параметров) получено, но вам нужно их отфильтровать: как вы обнаружили, простая обработка сеанса Telnet как чистого потока TCP не будет работать.

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

Нет реальной необходимостиКстати, слишком глубоко вникать в спецификации: вполне возможно использовать что-то заранее созданное, как эта минималистичная библиотека Telnet , чтобы разобраться с самыми важными для вас деталями.РЕДАКТИРОВАТЬ, 29 марта 2012 г .: Дополнительные примеры «мусора», которые вы видите, подтверждают, что пульт ДУ относится к вам как к VT100.Например: [0;1;4mTitle of Page Here соответствует Set Attribute Mode: <ESC>[{attr1};...;{attrn}m и пытается сделать заголовок страницы ярким (1) и подчеркнутым (4).

Самый простой вариант: как только вы увидите символ ESCape (ASCII 27), игнорируйте все после этого, вплоть до первого символа, которого нет в списке [;0123456789.Это лишит наиболее распространенных кодов VT100: есть несколько, которые могут требовать специальной обработки, но они редки, и в любом случае, у вас есть спецификации сейчас.

Но даже если вы удалите контрольные коды, вы можетепо-прежнему получается поток данных, которые не разбираются, особенно если хост пытается сохранить причудливый макет экрана.Например, он может случайно обновить поле состояния (например, часы) в середине потока значений, которые вас интересуют. В этом случае вам понадобится (виртуальный) скребок экрана приложения эмулятора VT100.Такие решения в основном связаны с дорогим коммерческим программным обеспечением, хотя libvt100 - чисто .net / C # библиотека для анализа потока VT100 / ANSI может работать для вас.

...