Перевод из шестнадцатеричного числа в десятичное

Необходимо было сопряжение фискального регистратора(ФР) Штрих..  — установка времени компьютера на фискальном регистраторе — пришлось общаться с ФР с помощью команд в шестнадцатеричном формате. Перевод из десятичного формата в шестнадцатеричный нашел — http://infostart.ru/public/83824/, а обратно нет, пришлось написать. И вот что получилось

Функция ПеревестиЧислоИзШестнадцатиричногоВДесятичное(СтрокаХекс) Экспорт

                мСтрокаХекс = СокрЛП(СтрокаХекс);

                СтрДлинаХексЧисла = СтрДлина(мСтрокаХекс);

                ДесятичноеЧисло = 0;

                Для Сч = 0 По СтрДлинаХексЧисла-1 Цикл

                               Множитель = Pow(16,Сч);

                               //Сообщить(«Множитель:»+Строка(Множитель));

                               НехЧисло1Байт = Сред(мСтрокаХекс,СтрДлинаХексЧисла-Сч,СтрДлинаХексЧисла-Сч);

                               //Сообщить(«ХексЧисло1Байт:» + НехЧисло1Байт);

                               Если НехЧисло1Байт = «A» Тогда

                                               ДесятичноеЧисло = ДесятичноеЧисло + 10*Множитель;

                               ИначеЕсли НехЧисло1Байт = «B» Тогда

                                               ДесятичноеЧисло = ДесятичноеЧисло + 11*Множитель;

                               ИначеЕсли НехЧисло1Байт = «C» Тогда

                                               ДесятичноеЧисло = ДесятичноеЧисло + 12*Множитель;

                               ИначеЕсли НехЧисло1Байт = «D» Тогда

                                               ДесятичноеЧисло = ДесятичноеЧисло + 13*Множитель;

                               ИначеЕсли НехЧисло1Байт = «E» Тогда

                                               ДесятичноеЧисло = ДесятичноеЧисло + 14*Множитель;

                                              

                               ИначеЕсли НехЧисло1Байт = «F» Тогда

                                               ДесятичноеЧисло = ДесятичноеЧисло + 15*Множитель;

                               Иначе

                                               Попытка

                                                               ДесятичноеЧисло = ДесятичноеЧисло + Число(НехЧисло1Байт)*Множитель;

                                               Исключение;

                                                               //не число от 0 до 9

                                               КонецПопытки

                               КонецЕсли;

                КонецЦикла;

                Возврат ДесятичноеЧисло;

 КонецФункции

 

28 Comments

  1. andrewks

    да уж… жесть жестяная.

    http://my1c-archive.narod.ru/knowhow/uni_conv.html

    Reply
  2. vladimir2008

    Спасибо за ссылку — теперь будет и на инфостате, если кто будет искать

    Reply
  3. Gesperid

    Во многих типовых есть процедуры типае — ОбщегоНазначения.ДесятичноеВШестнадцатиричное

    Reply
  4. Gesperid

    и ОбщегоНазначенияЗК.ШестнадцатиричноеВДесятичное

    Reply
  5. vladimir2008

    Спасибо, посмотрел в конфах: «Розница»,»БСП» — нет такой функции.

    В УПП есть:

    Функция ДесятичноеВШестнадцатиричное(Источник) Экспорт

    ШеснадцатиричныеСимволы = «0123456789ABCDEF»;

    Если Источник < 0 Тогда

    Возврат «00»;

    КонецЕсли;

    Если Источник > 255 Тогда

    Возврат «FF»;

    КонецЕсли;

    ПервыйСимвол = Цел(Источник / 16) + 1;

    ВтройСимвол = Источник % 16 + 1;

    Возврат Сред(ШеснадцатиричныеСимволы, ПервыйСимвол, 1) + Сред(ШеснадцатиричныеСимволы, ВтройСимвол, 1);

    КонецФункции

    Функция ШестнадцатиричноеВДесятичное(Источник) Экспорт

    Результат = 0;

    ШеснадцатиричныеСимволы = «0123456789ABCDEF»;

    ДлинаСтроки = СтрДлина(Источник);

    Для Поз = 1 По ДлинаСтроки Цикл

    ИскомыйСимвол = Сред(Источник,Поз,1);

    ЗначениеСимвола = Найти(ШеснадцатиричныеСимволы, ВРег(ИскомыйСимвол));

    Если ЗначениеСимвола <=0 Тогда

    #Если ТолстыйКлиентОбычноеПриложение Тогда

    Сообщить(«В числе обнаружен неверный символ: «»» + ИскомыйСимвол+ «»» «);

    #КонецЕсли

    Результат = 0;

    Прервать;

    Иначе

    ЗначениеСимвола = ЗначениеСимвола — 1;

    Результат = Результат + ЗначениеСимвола * Pow(16, ДлинаСтроки-Поз);

    КонецЕсли;

    КонецЦикла;

    Возврат Результат;

    КонецФункции

    Reply
  6. Linx-p

    Похоже в Вашем коде неточность.

    Строку

    НехЧисло1Байт = Сред(мСтрокаХекс,СтрДлинаХексЧисла-Сч,СтрДлинаХексЧисла-Сч);

    я бы переписал следующим образом:

    НехЧисло1Байт = Сред(мСтрокаХекс,СтрДлинаХексЧисла-Сч,1);
    Reply
  7. bzmax

    После долгих поисков и раздумий

    Вот две функции из десятичного в шестнадцатиричное

    и обратно.

    Просто, понятно и со вкусом 🙂

    Функция DecToHex(Знач _Dec) Экспорт
    ДесятичноеЗначение = _Dec;
    Результат = «»;
    Пока ДесятичноеЗначение > 0 Цикл
    Ост = ДесятичноеЗначение % 16 + 1;
    Результат = Сред(«0123456789ABCDEF», Ост, 1) + Результат;
    ДесятичноеЗначение = Цел(ДесятичноеЗначение/16);
    КонецЦикла;
    Возврат Результат;
    КонецФункции
    
    Функция HexToDec(Знач _Hex) Экспорт
    База = 16;
    _Hex = СокрЛП(_Hex);
    СтаршаяСтепень = СтрДлина(_Hex) — 1;
    Результат = 0;
    счСимволов = 1;
    Пока СтаршаяСтепень >=0 Цикл
    _HexСимвол = Сред(_Hex, счСимволов, 1);
    Представление = Найти(«0123456789ABCDEF», _HexСимвол) — 1;
    Результат = Результат + Представление * Pow(База, СтаршаяСтепень);
    СтаршаяСтепень = СтаршаяСтепень — 1;
    СчСимволов = СчСимволов + 1;
    КонецЦикла;
    Возврат Результат;
    КонецФункции

    Показать

    Пользуйтесь 🙂

    P.S. Сорри за монохромный код. (так и не понял как он тут раскрашивается).

    Reply
  8. vladimir2008

    Спасибо за функции!

    Reply
  9. kotich

    (7) bzmax, вы тестировали свою функцию DecToHex на значениях меньше 10? Вы же получите строчку с длиной меньше 2!

    Reply
  10. bzmax

    (9) kotich,

    Вы сами то поняли, что сказали? 🙂

    Смысл перегонять десятичные в шестнадцатиричные меньше 10 если они ОДИНАКОВЫ!

    (1,2,3,4,5,6,7,8,9)

    Достаточно из числа например 5, сделать строку «5».

    🙂

    Reply
  11. Goruch

    В ФР Штрих-М овском есть драйвер, который сию команду (установку времени) в 2 строки делает. Без всяких шестнадцатеричных-десятичных приблуд.

    Reply
  12. vladimir2008

    (11) Goruch, А обратно из ККМ тоже в десятичном формате?

    Reply
  13. vladimir2008

    От ККМ надо разбирать ответы по битам

    Reply
  14. Goruch

    Тоже можно… ща найду…

    Reply
  15. Goruch

    ФискальныйРегистратор.Password=Константа.ПарольСистемногоАдминистратора;

    ФискальныйРегистратор.Connect();

    Если ФискальныйРегистратор.ResultCode<>0 Тогда

    Предупреждение(«Ошибка кассы: «+ФискальныйРегистратор.ResultCodeDescription+»!»);

    Возврат;

    КонецЕсли;

    ФискальныйРегистратор.Password=Константа.ПарольСистемногоАдминистратора;

    ФискальныйРегистратор.GetECRStatus();

    Если ФискальныйРегистратор.ResultCode<>0 Тогда

    Предупреждение(«Ошибка кассы: «+ФискальныйРегистратор.ResultCodeDescription+»!»);

    Возврат;

    КонецЕсли;

    ДатаВККМ=Дата(ФискальныйРегистратор.Date);

    ВремяВККМ=Строка(ФискальныйРегистратор.TimeStr);

    Reply
  16. Goruch

    Скопировал код целиком с Штрих-М Кассира.

    Reply
  17. kotich

    (10) bzmax, вы когда пишите код, добавляйте проверки. Например, если параметр не входит в диапазон, выдавайте предупреждение, а ещё лучше — вызывайте исключение. Поймите, когда данная функция вызывается в цикле для массива десятичных чисел, на выходе собирается , строка шестнадцатеричного представления, подобную ошибку в работе вашего кода отследить довольно трудно, в 15 случаях из 16 она отработает корректно. Для 1С это актуально в том случае, если она работает с внешними базами через уникальные идентификаторы объектов.

    Reply
  18. vladimir2008

    (16) Goruch,

    Я пользовался драйвером для 1С: Из описания работы с ПО «ШТРИХ-М: Драйвер ФР» в соответствии с «требованиями к разработке драйверов для фискальных регистраторов» компании 1С:

    Там нет функций установки даты и времени только через команды: DeviceControl(УправлениеУстройством) или DeviceControlHEX(УправлениеУстройствомХекс)

    Reply
  19. Goruch

    (18) Обычно для периферии сканеры штрих-кодов, ТСД, Весы для печати этикеток, различные пос приблуды лучше использовать драйвера или атолла или Штрих-М.

    Иначе возни и мороки, как в вашем случае море.

    Единственное, когда я писал выгрузку товаров из 1С Штрих-М Кассир в весы там пришлось серьезно возиться с 10<->16 системы исчисления. Так что не завидую.:)

    Reply
  20. Goruch

    Вдогонку ftp://ftp.shtrih-m.ru/download/FR/shtrih-fr-k/doc/Driver4_6.pdf — описание драйвера ФР от Штрих-М.

    Reply
  21. DrZombi

    Автора на мыло!!! Смотреть лучше тут http://kb.mista.ru/article.php?id=78

    Reply
  22. vladimir2008

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

    Reply
  23. DrZombi
    Reply
  24. DrZombi
    Reply
  25. Euroset1
    ДатаТранзакции = ВРЕГ(ДатаТранзакции);
    ДатаТранзакцииЧисло = 0;
    для й = 1 по СтрДлина(ДатаТранзакции) цикл
    ДатаТранзакцииЧисло = ДатаТранзакцииЧисло * 16 + Найти(«0123456789ABCDEF», Сред(ДатаТранзакции, й, 1)) — 1;
    КонецЦикла;
    

    Проще некуда… перестаньте бездумно возводить в степень!!!

    Reply
  26. vladimir2008

    Прикольно тема не поднималась 3 года

    Reply
  27. Euroset1

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

    Reply
  28. vladimir2008

    Оптимистично!!!

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *