Симферопольский Форум: Telnet - увидеть данные в двоичном коде. - Симферопольский Форум

Перейти к содержимому

Внимание! Для всех новых пользователей введена премодерация сообщений и тем.
  • (3 Страниц)
  • +
  • 1
  • 2
  • 3
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

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

#21 Пользователь онлайн   CIBAS 

  • Живу здесь
  • PipPipPipPipPip
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Активный участник
  • Сообщений: 4 119
  • Регистрация: 07 июля 15
  • ГородСимферополь
  • Страна:  

Отправлено 21 ноября 2016 - 17:13

Всё правильно Вы написали - ALT + 0168
в английской раскладке - "¨". в русской - "Ё"
То есть один и тот же код можно представить по-разному,
а способ представления (в данном случае) зависит от свойств шрифта компонента отображения.


Поблагодарили: 1

#22 Пользователь офлайн   FreeLSD 

  • Живу здесь
  • PipPipPipPipPip
  • Перейти к галерее
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Старая гвардия
  • Сообщений: 12 535
  • Регистрация: 16 сентября 10
  • Страна:  

Отправлено 21 ноября 2016 - 18:53

Ну тут речь-то не о визуальном представлении. Компонента передает строку, сформированную символами, полученными из определенных кодов. 1С получает эту строку и вот тут начинается интересное. Насколько я понимаю, строка передается в виде кодов символов. Символ с кодом 168, который в английской раскладке = "¨", отображается в 1С как "Ё". Но меня-то интересуют именно коды. И вот код этого символа, когда я его получаю, равен уже 1025. Более того, если я прямо в отладчике 1С пишу ALT + 0168, вижу "¨", если ALT + 1025 - "Ё". Получается, компонента виновата? Но она не знает ничего о раскладках, а 1С использует ту же системную.

Или что-то случилось, или одно из двух.

#23 Пользователь офлайн   Gennadyi 

  • Живу здесь
  • PipPipPipPipPip
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Старая гвардия
  • Сообщений: 20 336
  • Регистрация: 17 сентября 10
  • ГородСимферополь
  • Страна:  

Отправлено 21 ноября 2016 - 19:16

Не надо переводить полученный байт в символ, надо использовать кодовое представление этого байта. В 7-ми битной таблице ASCII первые два столбца - неотображаемые управляющие коды !

Цитата

Таблица ASCII создавалась для обмена информацией по телетайпу. В набор были включены непечатаемые символы, используемые как команды для управления устройством телетайп

Не любо - не слушай, а врать не мешай !
"Величайшей ошибкой было бы думать, " © В. И. ЛЕНИН ПСС том 34, стр. 244.
", было бы величайшей ошибкой думать," © В. И. ЛЕНИН ПСС том 42, стр. 74.
"поругаешь власть — попадаешь под закон об оскорблении, похвалишь власть — попадаешь под закон о фейковых новостях" © В. Матвиенко

#24 Пользователь онлайн   CIBAS 

  • Живу здесь
  • PipPipPipPipPip
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Активный участник
  • Сообщений: 4 119
  • Регистрация: 07 июля 15
  • ГородСимферополь
  • Страна:  

Отправлено 21 ноября 2016 - 19:25

Напишите немножко отладочного кода:
не берите от компоненты строку из N байт, а
примите N однобайтных переменных, которые объявите не
как строковые, а как числовые и посмотрите что получили.

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


#25 Пользователь офлайн   urix 

  • Живу здесь
  • PipPipPipPipPip
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Активный участник
  • Сообщений: 606
  • Регистрация: 17 сентября 10
  • Страна:  

Отправлено 21 ноября 2016 - 19:28

Просмотр сообщенияFreeLSD (21 ноября 2016 - 18:53) писал:

Ну тут речь-то не о визуальном представлении. Компонента передает строку, сформированную символами, полученными из определенных кодов. 1С получает эту строку и вот тут начинается интересное. Насколько я понимаю, строка передается в виде кодов символов. Символ с кодом 168, который в английской раскладке = "¨", отображается в 1С как "Ё". Но меня-то интересуют именно коды. И вот код этого символа, когда я его получаю, равен уже 1025. Более того, если я прямо в отладчике 1С пишу ALT + 0168, вижу "¨", если ALT + 1025 - "Ё". Получается, компонента виновата? Но она не знает ничего о раскладках, а 1С использует ту же системную.

168 - Кодировка Windows ANSI (cyr) однобайтовая - Ё.
0х401 = 1025(дес) Юникод двухбайтовый - Ё.

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

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


#26 Пользователь офлайн   Местный Сусанин 

  • Живу здесь
  • PipPipPipPipPip
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Активный участник
  • Сообщений: 1 880
  • Регистрация: 10 апреля 12
  • ГородСимферополь
  • Страна:  

Отправлено 21 ноября 2016 - 19:39

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


#27 Пользователь офлайн   FreeLSD 

  • Живу здесь
  • PipPipPipPipPip
  • Перейти к галерее
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Старая гвардия
  • Сообщений: 12 535
  • Регистрация: 16 сентября 10
  • Страна:  

Отправлено 21 ноября 2016 - 20:35

Просмотр сообщенияCIBAS сказал:

Напишите немножко отладочного кода:
не берите от компоненты строку из N байт, а
примите N однобайтных переменных,

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

Просмотр сообщенияurix сказал:

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

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

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

Просмотр сообщенияМестный Сусанин сказал:

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

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

Или что-то случилось, или одно из двух.

#28 Пользователь офлайн   urix 

  • Живу здесь
  • PipPipPipPipPip
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Активный участник
  • Сообщений: 606
  • Регистрация: 17 сентября 10
  • Страна:  

Отправлено 21 ноября 2016 - 23:26

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

Цитата

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

Цитата

Компонента говорит, что приходит 5 байт.
Показывает строку "Ђ› "

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

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

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


#29 Пользователь онлайн   CIBAS 

  • Живу здесь
  • PipPipPipPipPip
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Активный участник
  • Сообщений: 4 119
  • Регистрация: 07 июля 15
  • ГородСимферополь
  • Страна:  

Отправлено 22 ноября 2016 - 00:20

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

Она даёт доступ (указатель) на байты (именно байты "в чистом виде"
без всяких учётов раскладок и кодировок) объектов типа AnsiString.
Компоненты обмена по tcp при помощи сокетов как правило
возвращают именно AnsiString.

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

Сообщение отредактировал CIBAS: 22 ноября 2016 - 00:26


#30 Пользователь офлайн   _sv_ 

  • Живу здесь
  • PipPipPipPipPip
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Активный участник
  • Сообщений: 2 369
  • Регистрация: 07 октября 16
  • ГородСимферополь
  • Страна:  

Отправлено 22 ноября 2016 - 00:55

Просмотр сообщенияFreeLSD (21 ноября 2016 - 20:35) писал:

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

Настоящий Telnet при установлении соединения передает дополнительные символы управления. Определяет тип терминала, раскладку клавиатуры и т.д.
Putty решает эту проблему тем, что открывает сетевой порт (или COM порт) в режиме RAW.
С передачей сложных символов будут проблемы у любого клиента.
В дополнение к этому надо учесть, что не будет работать Backspace.
Проще всего написать свою программку в 200-300 строк и обрабатывать данные уже оттуда.

Сергей.

#31 Пользователь офлайн   Rumlin 

  • Добрый волшебник
  • PipPipPipPipPip
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Старая гвардия
  • Сообщений: 42 233
  • Регистрация: 16 сентября 10
  • ГородHavana
  • Страна:  

Отправлено 22 ноября 2016 - 06:40

Просмотр сообщения_sv_ сказал:

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

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


Я детей вообще то боюсь, милостивый мой государь, - шумливы, жестоки и себялюбивы, а коли дети правят державой? ©Юлиан Семёнов
Ничего не делается к лучшему © Борис Раушенбах
Люди, люди — это самое главное. Люди дороже даже денег. © Ф.М. Достоевский

#32 Пользователь офлайн   FreeLSD 

  • Живу здесь
  • PipPipPipPipPip
  • Перейти к галерее
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Старая гвардия
  • Сообщений: 12 535
  • Регистрация: 16 сентября 10
  • Страна:  

Отправлено 22 ноября 2016 - 08:40

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

Или что-то случилось, или одно из двух.

#33 Пользователь офлайн   _sv_ 

  • Живу здесь
  • PipPipPipPipPip
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Активный участник
  • Сообщений: 2 369
  • Регистрация: 07 октября 16
  • ГородСимферополь
  • Страна:  

Отправлено 22 ноября 2016 - 10:59

Просмотр сообщенияFreeLSD (22 ноября 2016 - 08:40) писал:

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

Ну нормально. С такими ситуациями рано или поздно, но приходится сталкиваться.
Преобразование такой строки в Unicode может давать самые разные результаты в зависимости от того, в какой локализации работать программа.
Самый удобный способ это расширить строку нулями. Получив эдакий "не настоящий" Unicode.
Типа "0", "Старший байт данных", "0", "Младший байт", "0", "Знаковый байт".
Тогда пара "0" + байт будет пониматься как отдельный символ Unicode.
За некоторыми исключениями. Типа 00 - конец строки и т.д.
В целом самое правильное решение это преобразование данных перед обработкой. Ибо не сомневайтесь, что встретятся еще более экзотические варианты.

Сообщение отредактировал _sv_: 22 ноября 2016 - 10:59

Сергей.

Поблагодарили: 1

#34 Пользователь офлайн   FreeLSD 

  • Живу здесь
  • PipPipPipPipPip
  • Перейти к галерее
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Старая гвардия
  • Сообщений: 12 535
  • Регистрация: 16 сентября 10
  • Страна:  

Отправлено 22 ноября 2016 - 11:54

Просмотр сообщения_sv_ сказал:

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

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

Или что-то случилось, или одно из двух.

#35 Пользователь офлайн   Rumlin 

  • Добрый волшебник
  • PipPipPipPipPip
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Старая гвардия
  • Сообщений: 42 233
  • Регистрация: 16 сентября 10
  • ГородHavana
  • Страна:  

Отправлено 22 ноября 2016 - 13:19

Просмотр сообщенияFreeLSD сказал:

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

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


Я детей вообще то боюсь, милостивый мой государь, - шумливы, жестоки и себялюбивы, а коли дети правят державой? ©Юлиан Семёнов
Ничего не делается к лучшему © Борис Раушенбах
Люди, люди — это самое главное. Люди дороже даже денег. © Ф.М. Достоевский

#36 Пользователь офлайн   FreeLSD 

  • Живу здесь
  • PipPipPipPipPip
  • Перейти к галерее
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Старая гвардия
  • Сообщений: 12 535
  • Регистрация: 16 сентября 10
  • Страна:  

Отправлено 22 ноября 2016 - 13:59

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

Просмотр сообщения_sv_ сказал:

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

Или что-то случилось, или одно из двух.

#37 Пользователь офлайн   Rumlin 

  • Добрый волшебник
  • PipPipPipPipPip
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Старая гвардия
  • Сообщений: 42 233
  • Регистрация: 16 сентября 10
  • ГородHavana
  • Страна:  

Отправлено 22 ноября 2016 - 14:08

Изображение
https://imgur.com/gallery/rtOD6


Я детей вообще то боюсь, милостивый мой государь, - шумливы, жестоки и себялюбивы, а коли дети правят державой? ©Юлиан Семёнов
Ничего не делается к лучшему © Борис Раушенбах
Люди, люди — это самое главное. Люди дороже даже денег. © Ф.М. Достоевский

Поблагодарили: 2 :

#38 Пользователь офлайн   _sv_ 

  • Живу здесь
  • PipPipPipPipPip
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Активный участник
  • Сообщений: 2 369
  • Регистрация: 07 октября 16
  • ГородСимферополь
  • Страна:  

Отправлено 22 ноября 2016 - 18:17

Просмотр сообщенияFreeLSD (22 ноября 2016 - 11:54) писал:

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

С 1С я не знаком. Поэтому деталей не знаю. Но решение все равно кажется уж очень странным.
Т.е. бинарные данные удается записать напрямую в файл? Т.е. при общении с весами удается получить файл размером в 3 байта?
Если "да", то можно было бы преобразовать файл в читабельный вид прежде, чем преобразовывать его в строку.
Грубо говоря: Читаем в бинарный файл "А", запускаем конвертилку, получаем файл "Б", преобразовываем "Б" в Unicode строку.

Сергей.

#39 Пользователь офлайн   FreeLSD 

  • Живу здесь
  • PipPipPipPipPip
  • Перейти к галерее
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Старая гвардия
  • Сообщений: 12 535
  • Регистрация: 16 сентября 10
  • Страна:  

Отправлено 22 ноября 2016 - 19:14

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

Или что-то случилось, или одно из двух.

#40 Пользователь офлайн   urix 

  • Живу здесь
  • PipPipPipPipPip
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
  • Группа: Активный участник
  • Сообщений: 606
  • Регистрация: 17 сентября 10
  • Страна:  

Отправлено 22 ноября 2016 - 23:13

Просмотр сообщенияFreeLSD (21 ноября 2016 - 11:36) писал:

Компонента говорит, что приходит 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 индивидуальных преобразования.
Таблицу можно сделать в Экселе, или могу скинуть, если надо.
А, ну еще и функцию преобразования десятичные_в_двоичные.


Поделиться темой:


  • (3 Страниц)
  • +
  • 1
  • 2
  • 3
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей