Перейти к содержанию
Симферопольский Форум

Telnet - увидеть данные в двоичном коде.


FreeLSD

Рекомендуемые сообщения

Я дико извиняюсь что влажу в беседу.... А нахрена это вообще надо? Какой практический толк от этого дела?
Ссылка на комментарий
Поделиться на другие сайты

Напишите немножко отладочного кода:

не берите от компоненты строку из N байт, а

примите N однобайтных переменных,

Как? :) Именно этого я и хотел бы. Но компонента отдает именно строку, а 1С сама не умеет "готовить" ТСР :pardon:

Нужна таблица преобразования ANSI -> Unicode?

 

вернее, наоборот, из Unicode -> ANSI -> (byte-code)?

А вот таблицу, видимо, придется какую-то использовать, только какую, не знаю. Дело в том, что и то и то - юникод. Только, как выясняется, раскладки разные.

Какой практический толк от этого дела?

Чтение информации с весов.

Или что-то случилось, или одно из двух.
Ссылка на комментарий
Поделиться на другие сайты

все-таки, что возвращает компонента?

Приходят, естессно, байты. Причем и телнет, и компонента, которой я пользуют, эти байты показывает в виде строки. Вот последний пример: компонента говорит, что пришло 5 байт. И показывает мне строку из 10 символов!
Т.е. компонента умеет возвращать 5 байт? 5 байт - это 10 символов.

или возвращает преобразованные в строку?

Компонента говорит, что приходит 5 байт.

Показывает строку "Ђ› "

Или это уже 1С преобразовывает?

Но как бы там ни было, данные надо будет доставать из 1С?, а там строка. И, похоже, это строка в ansi (win-1251).

Хорошо, если прибор не должен возвращать спецсимволы, которые <20h (надо смотреть в документации). Иначе надо будет "переучивать" 1С хранить / принимать не "строку", а "байты".

 

Как вы достаете коды символов? Почему/зачем получаете коды unicode?

 

Часть таблицы перевода Unicode - cp1251 (русская)

Ссылка на комментарий
Поделиться на другие сайты

В мануалах по 1С посмотрите - нет ли там функции c_str()

 

Она даёт доступ (указатель) на байты (именно байты "в чистом виде"

без всяких учётов раскладок и кодировок) объектов типа AnsiString.

Компоненты обмена по tcp при помощи сокетов как правило

возвращают именно AnsiString.

 

Указанное справедливо для всяческих С++, в Вашем случае AnsiString,

возможно, называется по-другому, но метод тот же.

Изменено пользователем CIBAS
Ссылка на комментарий
Поделиться на другие сайты

Чтение информации с весов.

Настоящий Telnet при установлении соединения передает дополнительные символы управления. Определяет тип терминала, раскладку клавиатуры и т.д.

Putty решает эту проблему тем, что открывает сетевой порт (или COM порт) в режиме RAW.

С передачей сложных символов будут проблемы у любого клиента.

В дополнение к этому надо учесть, что не будет работать Backspace.

Проще всего написать свою программку в 200-300 строк и обрабатывать данные уже оттуда.

Сергей.
Ссылка на комментарий
Поделиться на другие сайты

Проще всего написать свою программку в 200-300 строк и обрабатывать данные уже оттуда.

Этот "прокси" где-то надо не забыть запустить и правильно настроить на адрес. Скорее всео что делать программу, что сразу нужную библиотеку - одно и тоже.


Я детей вообще то боюсь, милостивый мой государь, - шумливы, жестоки и себялюбивы, а коли дети правят державой? ©Юлиан Семёнов

Ничего не делается к лучшему © Борис Раушенбах

Люди, люди — это самое главное. Люди дороже даже денег. © Ф.М. Достоевский

Ссылка на комментарий
Поделиться на другие сайты

Компонента выдает строку. Во всяком случае, 1С получает данные уже в виде строки. Дальше проблема в том, что функция КодСимвола() работает только для unicode. Но возможности преобразовать кодировку текста вроде имеются. В крайнем случае можно нарисовать свою. Сейчас буду пробовать :rolleyes2:

Писать программку (да и заменять компоненту) - это крайний случай, если уж совсем ничего не получится. Дело в том, что накопили уже разборы протоколов для почти десятка разных весов, все это при замене компоненты переделывать придется. Просто у всех значения веса передаются "as is", там неважно, в какой анси/шманси цифры идут. А тут, блин, "...в прямом коде в двоичной системе счисления ..." да еще с обратным порядком байтов :facepalm: (а знак там потом отдельным битом в следующем байте).

Или что-то случилось, или одно из двух.
Ссылка на комментарий
Поделиться на другие сайты

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

Ну нормально. С такими ситуациями рано или поздно, но приходится сталкиваться.

Преобразование такой строки в Unicode может давать самые разные результаты в зависимости от того, в какой локализации работать программа.

Самый удобный способ это расширить строку нулями. Получив эдакий "не настоящий" Unicode.

Типа "0", "Старший байт данных", "0", "Младший байт", "0", "Знаковый байт".

Тогда пара "0" + байт будет пониматься как отдельный символ Unicode.

За некоторыми исключениями. Типа 00 - конец строки и т.д.

В целом самое правильное решение это преобразование данных перед обработкой. Ибо не сомневайтесь, что встретятся еще более экзотические варианты.

Изменено пользователем _sv_
Сергей.
Ссылка на комментарий
Поделиться на другие сайты

самое правильное решение это преобразование данных перед обработкой

Таким путем и пошел. Учитывая, что 1С умеет менять кодировку текста только через файл (!), пришлось загнать таблицу кодов в структуру и искать в ней символы (ищу только если КодСимвола() получается больше 255). Вроде пока работает )

Или что-то случилось, или одно из двух.
Ссылка на комментарий
Поделиться на другие сайты

только через файл

Бедный HDD. Дырку протрет :)


Я детей вообще то боюсь, милостивый мой государь, - шумливы, жестоки и себялюбивы, а коли дети правят державой? ©Юлиан Семёнов

Ничего не делается к лучшему © Борис Раушенбах

Люди, люди — это самое главное. Люди дороже даже денег. © Ф.М. Достоевский

Ссылка на комментарий
Поделиться на другие сайты

Ну не столько жалко диск, сколько время на файловые операции. В структуре найти буковку проще и быстрее, чем писать/читать, к тому же за кадром 1С наверняка похожую операцию выполняет :acute: Так что не поленился забить таблицу символов. Тем более что

встретятся еще более экзотические варианты.

;)
Или что-то случилось, или одно из двух.
Ссылка на комментарий
Поделиться на другие сайты


Я детей вообще то боюсь, милостивый мой государь, - шумливы, жестоки и себялюбивы, а коли дети правят державой? ©Юлиан Семёнов

Ничего не делается к лучшему © Борис Раушенбах

Люди, люди — это самое главное. Люди дороже даже денег. © Ф.М. Достоевский

Ссылка на комментарий
Поделиться на другие сайты

пришлось загнать таблицу кодов в структуру и искать в ней символы. Вроде пока работает

С 1С я не знаком. Поэтому деталей не знаю. Но решение все равно кажется уж очень странным.

Т.е. бинарные данные удается записать напрямую в файл? Т.е. при общении с весами удается получить файл размером в 3 байта?

Если "да", то можно было бы преобразовать файл в читабельный вид прежде, чем преобразовывать его в строку.

Грубо говоря: Читаем в бинарный файл "А", запускаем конвертилку, получаем файл "Б", преобразовываем "Б" в Unicode строку.

Сергей.
Ссылка на комментарий
Поделиться на другие сайты

Не совсем так. В файл пришлось бы писать мне, если бы я хотел изменить кодировку одной строкой кода, т.к. 1С умеет это делать только с текстовыми файлами. Строка, которая пришла с устройства - она в памяти. Поэтому, чтобы не грузить систему медленными операциями, пришлось писать свою функцию преобразования, тем более что это не так трудно. Время реакции критично - если на мониторе вес обновляется визуально позже, чем на дисплее весов, это плохо :acute: А поиск по упорядоченной коллекции времени практически не отнимает, тем более что вызываю я его только при необходимости - если код символа вылазит за пределы байта.
Или что-то случилось, или одно из двух.
Ссылка на комментарий
Поделиться на другие сайты

Компонента говорит, что приходит 5 байт.

Показывает строку "Ђ› "

Получаю коды символов: 1026 4 8250 0 0

Перевожу их в двоичный вид: 10000000010 00000100 10000000111010 00000000 00000000

Ну и какие же это байты? Длина должна быть 40 бит.

Кстати, в строке не все символы отобразились как есть, браузер, похоже, не умеет.

Надо иметь контрольные примеры, в которых заранее будем знаем ответы.

Из-за искажения в браузере строки "Ђ› " у вас было, что-то похожее на "Ђ┘› "?

У меня получились первые 3 байта такие же как у вас: в юникоде 1026 4 8250, что соответствует 80h 04h 9Bh в однобайтовой кодировке.

С двумя последними символами непонятно. Либо это нули, как у вас, либо пробелы 20h, либо остается один байт A0h с, вероятно, символом удаления 7Fh.

Т.о. варианты:

10000000 00000100 10011011 00000000 00000000 (Ваш)
10000000 00000100 10011011 00100000 00100000  или
10000000 00000100 10011011 10100000 01111111

Если это так, то остается только написать функцию преобразования кода юникода в код анси.

для код_юникод от 0 до 127 код_а = код_юникод

для код_юникод от 1040 до 1103 код_а = код_юникод - 848 //русские символы

и еще 64 индивидуальных преобразования.

Таблицу можно сделать в Экселе, или могу скинуть, если надо.

А, ну еще и функцию преобразования десятичные_в_двоичные.

Ссылка на комментарий
Поделиться на другие сайты

Что за весы и где на них описание можно увидеть ?

зы

Зачем нужно приводить байт в соответствие с каким-то печатным символом (буквой)?

Не любо - не слушай, а врать не мешай !

"Величайшей ошибкой было бы думать, " © В. И. ЛЕНИН ПСС том 34, стр. 244.

", было бы величайшей ошибкой думать," © В. И. ЛЕНИН ПСС том 42, стр. 74.

"поругаешь власть — попадаешь под закон об оскорблении, похвалишь власть — попадаешь под закон о фейковых новостях" © В. Матвиенко

Ссылка на комментарий
Поделиться на другие сайты

Зачем нужно приводить байт в соответствие с каким-то печатным символом (буквой)?

Полагаю, что это какое-то выкаблучивание 1С и/или тех "компонент", которые уже написаны.

 

Что за весы?

Та с подобными проблемами сталкиваются все, кто пишет подобные универсальные программы.

Сергей.
Ссылка на комментарий
Поделиться на другие сайты

Не любо - не слушай, а врать не мешай !

"Величайшей ошибкой было бы думать, " © В. И. ЛЕНИН ПСС том 34, стр. 244.

", было бы величайшей ошибкой думать," © В. И. ЛЕНИН ПСС том 42, стр. 74.

"поругаешь власть — попадаешь под закон об оскорблении, похвалишь власть — попадаешь под закон о фейковых новостях" © В. Матвиенко

Ссылка на комментарий
Поделиться на другие сайты

Не любо - не слушай, а врать не мешай !

"Величайшей ошибкой было бы думать, " © В. И. ЛЕНИН ПСС том 34, стр. 244.

", было бы величайшей ошибкой думать," © В. И. ЛЕНИН ПСС том 42, стр. 74.

"поругаешь власть — попадаешь под закон об оскорблении, похвалишь власть — попадаешь под закон о фейковых новостях" © В. Матвиенко

Ссылка на комментарий
Поделиться на другие сайты

Что за весы и где на них описание можно увидеть ?

зы

Зачем нужно приводить байт в соответствие с каким-то печатным символом (буквой)?

Например, нашел такое https://www.mera-device.ru/upload/iblock/233/pvm_nastolnye_red_07.13.02.pdf

Передача производится после стабилизации показаний массы. Данные

передаются дважды, в виде двух одинаковых посылок. Каждая посылка содержит

5 байт:

 Префикс     Вес    Знак
055h 0AAh  LSB MSB  SGN

где:

- 1 и 2 байты – код начала посылки;

- 3 и 4 байты – значение веса в граммах в двоичной системе счисления

(4 байт – старший);

- 5 байт – знак веса (00h — плюс, 080h — минус).

Но если это тот же протокол, что и у автора темы, то, похоже, драйвер что-то не то "прочитал".

Ссылка на комментарий
Поделиться на другие сайты

остается только написать функцию преобразования кода юникода в код анси.

Да, собственно, уже. Вопрос только с одним символом - который в анси = AD. Таблицы с интернетов его не включают, т.к. браузеры его не отображают (. Вот думаю, как его влепить. Остальное вроде нормально работает.

еще и функцию преобразования десятичные_в_двоичные.

Я таблицу делал в hex'е, так что шестнадцатиричные в двоичные - ну так это еще проще.

Или что-то случилось, или одно из двух.
Ссылка на комментарий
Поделиться на другие сайты

Что за весы

Масса-К, описание на сайте

 

Зачем нужно приводить байт в соответствие с каким-то печатным символом (буквой)?

Еще раз - так байты выдаются компонентой, которая читает порт. Других вариантов не предусмотрено, самому писать "велосипед" неохота.

Но если это тот же протокол, что и у автора темы

Фишка в том, что свой протокол у каждого производителя, иногда еще на разные модели отличаются. Стандарта никакого нет. Поэтому каждого нового приходится вносить отдельно. Чаще они достаточно просто выглядят, отличия в нюансах, но встречаются разные приколы. А конкретно этого нельзя игнорировать, это очень популярные весы.

Или что-то случилось, или одно из двух.
Ссылка на комментарий
Поделиться на другие сайты

Это та самая компонента, стандарт де-факто для работы с TCP из 1С и не только )

 

А это хорошее решение, но пройденный этап - чтобы с ним работать, надо TCP порты сделать виртуальными COM-портами, а это дополнительная "прокладка", понижает производительность (проверено) и с определенного количества (примерно три десятка портов) начинает глючить (проверено). Поэтому сейчас ориентируемся на работу с TCP портами напрямую.

Кстати, vk_rs232 написана довольно давно энтузиастом и до сих пор повсеместно используется, потому что 1) бесплатна 2) проста 3) функциональна.

Пока работали с ней, горя не знал - у нее есть вариант, который как раз выдает байты в шестнадцатиричном виде.

Или что-то случилось, или одно из двух.
Ссылка на комментарий
Поделиться на другие сайты

Да, собственно, уже. Вопрос только с одним символом - который в анси = AD. Таблицы с интернетов его не включают, т.к. браузеры его не отображают (. Вот думаю, как его влепить. Остальное вроде нормально работает.

Какой с ним вопрос? без изменений, такой же код как и в Юникоде - AD (173).

"173 ­ AD ­ 173 0"

173 -­ AD -­ 173 0

 

Вы же код этого символа из строки прочитали?

 

post-159-081594500 1479883003_thumb.png

Ссылка на комментарий
Поделиться на другие сайты

А, ну если он в юникоде такой же, то вопрос снимается. Он и так меньше 255 и в таблице искать его нужно не будет :bravo:

Кстати, всё работает уже, быстро и точно.

Или что-то случилось, или одно из двух.
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...

Чат

Чат

Please enter your display name

×
×
  • Создать...