FreeLSD Опубликовано 21 ноября, 2016 Жалоба Опубликовано 21 ноября, 2016 Возникла такая вот потребность. Работаю с устройством, протокол которого описан в двоичном виде. Телнет же и все компоненты, которые я знаю, возвращают символьную строку. Если её просто перевести в двоичную форму (через коды символов), результат получается, мягко говоря, не совсем соответствующий описанию. При этом видно, что частично всё же получается то, что ожидал, частично же - какая-то пурга. Хочу увидеть, что же говорит система сразу в двоичном виде, потому что подозреваю "испорченный телефон" при преобразованиях туда-обратно. Вот только не могу найти, каким способом это сделать. Задача - подключиться на нужный адрес/порт, отправить туда определённое значение и получить двоичный ответ. Гугление дает массу вопросов на эту тему и что-то совсем не даёт ответов :unsure: То ли я не так спрашиваю, то ли действительно проблема... Цитата Или что-то случилось, или одно из двух.
Пэтро Опубликовано 21 ноября, 2016 Жалоба Опубликовано 21 ноября, 2016 Может все таки шеснадцатиричный? Надо написать программу работающую с сокетами. Простейший вариант на php. Или возможноhttp://the.earth.li/~sgtatham/putty/0.61/htmldoc/Chapter3.html#using-rawprot Цитата Подключаем Оптический гигабитный интернет в Симферополе и районе.+79787647406http://lugovoe.su
FreeLSD Опубликовано 21 ноября, 2016 Автор Жалоба Опубликовано 21 ноября, 2016 Не, там именно двоичный и протокол описан на уровне битов. Приходят, естессно, байты. Причем и телнет, и компонента, которой я пользуют, эти байты показывает в виде строки. Вот последний пример: компонента говорит, что пришло 5 байт. И показывает мне строку из 10 символов! То есть, видимо, значение этих байтов не позволяет нормально преобразовать их в символьную строку. Само собой, если я начинаю перегонять их обратно в двоичный код, получаю фигню. Мне бы увидеть один в один что пришло.P.S. использую mswinsck.ocx. Цитата Или что-то случилось, или одно из двух.
Пэтро Опубликовано 21 ноября, 2016 Жалоба Опубликовано 21 ноября, 2016 Или возможноhttp://the.earth.li/~sgtatham/putty/0.61/htmldoc/Chapter3.html#using-rawprot Цитата Подключаем Оптический гигабитный интернет в Симферополе и районе.+79787647406http://lugovoe.su
Пэтро Опубликовано 21 ноября, 2016 Жалоба Опубликовано 21 ноября, 2016 Проблема в том что байты преобразовываются в символы с помощью таблицы соответствия Win-1251, koi-8 типа того. Байты они не читаемы. Цитата Подключаем Оптический гигабитный интернет в Симферополе и районе.+79787647406http://lugovoe.su
FreeLSD Опубликовано 21 ноября, 2016 Автор Жалоба Опубликовано 21 ноября, 2016 (изменено) А, нет, погорячился. Со строкой все правильно, только от этого не легче.Описание протокола: приходит 5 байт. Компонента говорит, что приходит 5 байт.Показывает строку "Ђ› "Получаю коды символов: 1026 4 8250 0 0Перевожу их в двоичный вид: 10000000010 00000100 10000000111010 00000000 00000000Ну и какие же это байты? Длина должна быть 40 бит.Кстати, в строке не все символы отобразились как есть, браузер, похоже, не умеет. Изменено 21 ноября, 2016 пользователем FreeLSD Цитата Или что-то случилось, или одно из двух.
FreeLSD Опубликовано 21 ноября, 2016 Автор Жалоба Опубликовано 21 ноября, 2016 Проблема в том что байты преобразовываются в символы с помощью таблицы соответствияЯ понимаю, что проблема именно в этом. Но я не могу заставить 1С читать коды символов в чем-то кроме юникода. И вообще не представляю, как их выдает компонента. Поэтому мне бы избежать всяких преобразований вообще. Понятно, что можно взять и наваять что-то самому. Но зачем изобретать велосипед, наверняка же такая задача возникала уже в истории человечества :) Цитата Или что-то случилось, или одно из двух.
Rumlin Опубликовано 21 ноября, 2016 Жалоба Опубликовано 21 ноября, 2016 Дюже древняя утилита. Использовaние клиента Telnet в качестве транспорта для бинарных файлов невозможно из-за спeцифики протокола (более подробно в RFC854 про ). Поэтому без потерь мoжно передавать файлы, содержащие стандартный набор ASCII-символов.https://xakep.ru/2013/11/25/61645/ Т.е. устройство сетевое и у нее есть какой-то открытый порт ? Цитата Я детей вообще то боюсь, милостивый мой государь, - шумливы, жестоки и себялюбивы, а коли дети правят державой? ©Юлиан Семёнов Ничего не делается к лучшему © Борис РаушенбахЛюди, люди — это самое главное. Люди дороже даже денег. © Ф.М. Достоевский
Пэтро Опубликовано 21 ноября, 2016 Жалоба Опубликовано 21 ноября, 2016 Можно расписать максимально подробно, что куда передаётся чем принимается и как обрабатывается. Хорошо заданный вопрос уже 50% ответа Цитата Подключаем Оптический гигабитный интернет в Симферополе и районе.+79787647406http://lugovoe.su
FreeLSD Опубликовано 21 ноября, 2016 Автор Жалоба Опубликовано 21 ноября, 2016 Ну вот то, что я знаю/понимаю:1. Устройство (весы). Имеет IP-адрес, слушает на определенном порту. Принимает запрос и возвращает 5 байт. 2. В этих байтах имеют значение отдельные биты (так организован протокол), к тому же часть данных передается в обратном порядке (сначала второй байт, потом первый). 3. Компонента mswinsck.ocx, получив эти 5 байт, выдает их в виде строки (т.е. байты уже преобразованы в символы). Попытка преобразовать и обратно хотя бы в 16ричный код дает иногда нормальный, иногда странный результат. Putty видит все как надо, хоть и в 16ричном, а не двоичном виде. Так что проблема все-таки в преобразовании значения в символ. Вывод: с используемой компонентой вряд ли можно добиться нормального результата, хотя бы потому, что принципы "озвучивания" ею байтов не ясны. Цитата Или что-то случилось, или одно из двух.
Rumlin Опубликовано 21 ноября, 2016 Жалоба Опубликовано 21 ноября, 2016 Можно послушать этот аппарат с помощью Wireshark. Вот пример - видим в телнет 4 символа, а в реальности их 7. Цитата Я детей вообще то боюсь, милостивый мой государь, - шумливы, жестоки и себялюбивы, а коли дети правят державой? ©Юлиан Семёнов Ничего не делается к лучшему © Борис РаушенбахЛюди, люди — это самое главное. Люди дороже даже денег. © Ф.М. Достоевский
FreeLSD Опубликовано 21 ноября, 2016 Автор Жалоба Опубликовано 21 ноября, 2016 Собственно, послушать уже получилось. Видно, что даже в шестнадцатиричном виде там все норм. Проблема начинается в том месте, когда компонента пытается сделать из этого строку. Поэтому теперь вопрос стоит так: а неужели вообще никому никогда не нужно было видеть "приход" как есть, без дурацкого перевода? Потому что найти такую компоненту пока не удалось, хоть сам садись пиши. Цитата Или что-то случилось, или одно из двух.
Rumlin Опубликовано 21 ноября, 2016 Жалоба Опубликовано 21 ноября, 2016 FreeLSD, а как он управляющие символы в строку слепит? https://ru.wikipedia.org/wiki/%D0%A3%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D1%8F%D1%8E%D1%89%D0%B8%D0%B5_%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D1%8B Цитата Я детей вообще то боюсь, милостивый мой государь, - шумливы, жестоки и себялюбивы, а коли дети правят державой? ©Юлиан Семёнов Ничего не делается к лучшему © Борис РаушенбахЛюди, люди — это самое главное. Люди дороже даже денег. © Ф.М. Достоевский
FreeLSD Опубликовано 21 ноября, 2016 Автор Жалоба Опубликовано 21 ноября, 2016 Там мне строка и не нужна. Мне нужен сам байт, как есть, пусть как Putty делает, в шестнадцатиричном виде хотя бы. Вот компонента для COM порта, популярная у 1сников, это умеет. А для TCP - ничего пока не нашел. Цитата Или что-то случилось, или одно из двух.
FreeLSD Опубликовано 21 ноября, 2016 Автор Жалоба Опубликовано 21 ноября, 2016 Пытаюсь понять логику, по которой образуется строка.Пример: Putty показывает байт A8. mswinsck передает в 1С его в виде буквы "Ё". 1С определяет, что код этого символа - 1025 (десятичный). Но это не соответствует шестнадцатиричному! Вот и возникает проблема. Цитата Или что-то случилось, или одно из двух.
Пэтро Опубликовано 21 ноября, 2016 Жалоба Опубликовано 21 ноября, 2016 А как компонента работает? Это activex библиотека? Она подключается к 1с? И какие есть варианты её заменить? Как выглядит запрос? Цитата Подключаем Оптический гигабитный интернет в Симферополе и районе.+79787647406http://lugovoe.su
Пэтро Опубликовано 21 ноября, 2016 Жалоба Опубликовано 21 ноября, 2016 Какие способы приёма данных поддерживает 1с? Http? Цитата Подключаем Оптический гигабитный интернет в Симферополе и районе.+79787647406http://lugovoe.su
FreeLSD Опубликовано 21 ноября, 2016 Автор Жалоба Опубликовано 21 ноября, 2016 Как работает компонента, понятия не имею )Это ActiveX бибилиотека, часть Visual Studio, насколько я знаю. Файл mswinsck.ocx. 1Сники часто его используют, посколльсу стандартный, легкодоступный и легкоприменяемый.К 1С подключается как обычный ActiveX компонент.До сих пор проблем с ней не было, это первый случай. Да и то не факт, что именно с ней проблема, возможно, проблема в разных таблицах символов.На что заменить, не знаю, вот и ищу.1С поддерживает кучу способов обмена, вот только TCP/IP среди них почему-то и нет. Почему и приходится рассчитывать на внешние компоненты. Цитата Или что-то случилось, или одно из двух.
FreeLSD Опубликовано 21 ноября, 2016 Автор Жалоба Опубликовано 21 ноября, 2016 hex A8 = dec 168Набираю ALT+168, получаю "¨". Почему-то компонента передает "Ё" Цитата Или что-то случилось, или одно из двух.
FreeLSD Опубликовано 21 ноября, 2016 Автор Жалоба Опубликовано 21 ноября, 2016 Возник вопрос: а если там действительно разные таблицы кодирования?В Юникоде символ с кодом A8 - это http://www.fileformat.info/info/unicode/char/a8/index.htm.Можно ли как-то быстро определить, в какой существующей таблице этот код соответствует символу http://www.fileformat.info/info/unicode/char/0401/index.htm? Цитата Или что-то случилось, или одно из двух.
CIBAS Опубликовано 21 ноября, 2016 Жалоба Опубликовано 21 ноября, 2016 Всё правильно Вы написали - ALT + 0168в английской раскладке - "¨". в русской - "Ё"То есть один и тот же код можно представить по-разному,а способ представления (в данном случае) зависит от свойств шрифта компонента отображения. Цитата
FreeLSD Опубликовано 21 ноября, 2016 Автор Жалоба Опубликовано 21 ноября, 2016 Ну тут речь-то не о визуальном представлении. Компонента передает строку, сформированную символами, полученными из определенных кодов. 1С получает эту строку и вот тут начинается интересное. Насколько я понимаю, строка передается в виде кодов символов. Символ с кодом 168, который в английской раскладке = "¨", отображается в 1С как "Ё". Но меня-то интересуют именно коды. И вот код этого символа, когда я его получаю, равен уже 1025. Более того, если я прямо в отладчике 1С пишу ALT + 0168, вижу "¨", если ALT + 1025 - "Ё". Получается, компонента виновата? Но она не знает ничего о раскладках, а 1С использует ту же системную. Цитата Или что-то случилось, или одно из двух.
Gennadyi Опубликовано 21 ноября, 2016 Жалоба Опубликовано 21 ноября, 2016 Не надо переводить полученный байт в символ, надо использовать кодовое представление этого байта. В 7-ми битной таблице ASCII первые два столбца - неотображаемые управляющие коды ! Таблица ASCII создавалась для обмена информацией по телетайпу. В набор были включены непечатаемые символы, используемые как команды для управления устройством телетайп Цитата Не любо - не слушай, а врать не мешай !"Величайшей ошибкой было бы думать, " © В. И. ЛЕНИН ПСС том 34, стр. 244.", было бы величайшей ошибкой думать," © В. И. ЛЕНИН ПСС том 42, стр. 74."поругаешь власть — попадаешь под закон об оскорблении, похвалишь власть — попадаешь под закон о фейковых новостях" © В. Матвиенко
CIBAS Опубликовано 21 ноября, 2016 Жалоба Опубликовано 21 ноября, 2016 Напишите немножко отладочного кода:не берите от компоненты строку из N байт, а примите N однобайтных переменных, которые объявите некак строковые, а как числовые и посмотрите что получили. Не будучи знакомым с языком, на котором Вы всё это пишете,не могу выразиться более точно ..... Цитата
urix Опубликовано 21 ноября, 2016 Жалоба Опубликовано 21 ноября, 2016 Ну тут речь-то не о визуальном представлении. Компонента передает строку, сформированную символами, полученными из определенных кодов. 1С получает эту строку и вот тут начинается интересное. Насколько я понимаю, строка передается в виде кодов символов. Символ с кодом 168, который в английской раскладке = "¨", отображается в 1С как "Ё". Но меня-то интересуют именно коды. И вот код этого символа, когда я его получаю, равен уже 1025. Более того, если я прямо в отладчике 1С пишу ALT + 0168, вижу "¨", если ALT + 1025 - "Ё". Получается, компонента виновата? Но она не знает ничего о раскладках, а 1С использует ту же системную.168 - Кодировка Windows ANSI (cyr) однобайтовая - Ё. 0х401 = 1025(дес) Юникод двухбайтовый - Ё. Нужна таблица преобразования ANSI -> Unicode? вернее, наоборот, из Unicode -> ANSI -> (byte-code)? Цитата
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.