|   |   | 
| 
 | Конвертация десятичного числа в Wiegand 34 | ☑ | ||
|---|---|---|---|---|
| 0
    
        aptomilov 24.06.21✎ 10:04 | 
        Возникла такая необходимость из 1с складывать в базу скуд штрих в родном формате Wiegand 34
 Опыты показали что при сканировании штрихкода 1234567890128 получаем в базе цихру 251,01232. Пока не могу понять алгоритм преобразования Может кто сталкивался ? | |||
| 1
    
        Bigbro 24.06.21✎ 10:07 | 
        я сталкивался с задачами аппроксимации, в простых случаях по 2 точкам построить прямую.
 но так чтобы по одной точке... )))) | |||
| 2
    
        aptomilov 24.06.21✎ 10:08 | 
        460123456788 - 243,45774,
 460123456789 - 243,45781 | |||
| 3
    
        Вафель 24.06.21✎ 10:09 | ||||
| 4
    
        aptomilov 24.06.21✎ 10:11 | 
        (3) видел я его он вообще не те цыхры выдает     | |||
| 5
    
        Вафель 24.06.21✎ 10:11 | ||||
| 6
    
        Вафель 24.06.21✎ 10:12 | 
        на (0) верно работает     | |||
| 7
    
        aptomilov 24.06.21✎ 10:12 | 
        460123456790 - 243,45797     | |||
| 8
    
        aptomilov 24.06.21✎ 10:15 | 
        (6) там я смотрю прям в оборудовании
 (5) а вот этот работает надо попробовать теперь алгоритм увидеть | |||
| 9
    
        Garykom гуру 24.06.21✎ 10:17 | 
        (0) "Wiegand-34. Состоит из 32 бит кода и 2 бит контроля на четность."     | |||
| 10
    
        Garykom гуру 24.06.21✎ 10:18 | 
        (9)+ "Если имеется контроль по чётности, то к битам кода карты добавляются два бита — один перед кодом, другой после. Соответственно весь код карты делится ровно посередине на две части. Чётность старшей половины кода контролируется первым битом, младшей — последним. Если количество бит в коде нечётное, то центральный бит кода входит в оба контроля чётности.
 Первый бит чётности (старшей половины кода) ставится в 1 если количество единиц в его половине кода нечётное. Последний бит чётности (младшей половины кода) ставится в 1 если количество единиц в его половине кода чётное. Надо заметить, что встречаются считыватели не подчиняющиеся этому правилу контроля чётности. Поэтому реально большинство универсальных контроллеров СКУД просто игнорируют контроль на чётность. Кроме того, некоторые форматы бесконтактных карт несут информацию о количестве бит кода и чётности прямо на карте, соответственно считыватель не может никоим образом влиять на реальный выходной формат данных. Таков, например, формат HID ProxPass, Indala ASP и др." | |||
| 11
    
        Вафель 24.06.21✎ 10:21 | 
        function codeHex2Txt( instr ) { // var codeHex = instr.substring(4,6) + instr.substring(2,4) + instr.substring(0,2); var codeHex = instr.toUpperCase(); var l = codeHex.length; var codeP1 = codeHex.substring(0,l-4); var codeP2 = codeHex.substring(l-4); var codeP1I = parseInt(codeP1,16); var codeP2I = parseInt(codeP2,16); var codeText = ("000" + codeP1I).slice(-3) + ',' + ("00000" + codeP2I).slice(-5); return codeText; } | |||
| 12
    
        aptomilov 24.06.21✎ 10:23 | 
        только хотел вставить )) 
 осталось на 1С переписать | |||
| 13
    
        aptomilov 24.06.21✎ 12:06 | 
        codeP1I = parseInt(codeP1,16);
 Знает кто нибудь аналог это функции в 1с 8 | |||
| 14
    
        Вафель 24.06.21✎ 12:11 | 
        Это конвертация из 16 в 10     | |||
| 15
    
        NorthWind 24.06.21✎ 12:15 | 
        (13) можно написать самому. Алгоритм несложный.     | |||
| 16
    
        Вафель 24.06.21✎ 12:16 | 
        В цикле С = с + хi * 16 | |||
| 17
    
        Вафель 24.06.21✎ 12:16 | 
        16^i     | |||
| 18
    
        aptomilov 24.06.21✎ 12:38 | 
        Функция ПеревестиЧислоИзШестнадцатиричногоВДесятичное(пHex) Экспорт
 Разрядность = 16; пHex = СокрЛП(пHex); МаксСтепень = СтрДлина(пHex) - 1; ч10Число = 0; счСимв = 1; Пока МаксСтепень >=0 Цикл пHexСимвол = Сред(пHex, счСимв, 1); ПредставлениеHex = Найти("0123456789ABCDEF", пHexСимвол) - 1; ч10Число = ч10Число + ПредставлениеHex * Pow(Разрядность, МаксСтепень); МаксСтепень = МаксСтепень - 1; счСимв = счСимв + 1; КонецЦикла; Возврат ч10Число; //Десятичное число (Число) КонецФункции | |||
| 19
    
        aptomilov 24.06.21✎ 12:38 | 
        вот эта верно считает нашел еще несколько не тот результат     | |||
| 20
    
        aptomilov 24.06.21✎ 13:16 | 
        Штрих = "1234567890128";
 codeHex = ВРег(Штрих);; l = СтрДлина(Штрих); //codeHex = instr.toUpperCase(); //l = codeHex.length; codeP1 = Лев(codeHex,l-4); codeP2 = Сред(codeHex,l-4+1); // var codeP1 = codeHex.substring(0,l-4); // var codeP2 = codeHex.substring(l-4); codeP1I= ПеревестиЧислоИзШестнадцатиричногоВДесятичное(codeP1); codeP2I= ПеревестиЧислоИзШестнадцатиричногоВДесятичное(codeP2); // codeP1I = parseInt(codeP1,16); //codeP2I = parseInt(codeP2,16); codeText = Прав("000" + codeP1I,3) + "," + Прав("00000" + codeP2I,5); //codeText = ("000" + codeP1I).slice(-3) + ',' + ("00000" + codeP2I).slice(-5); //345,00296 - так получается //251,01232 - так должно получиться | |||
| 21
    
        aptomilov 24.06.21✎ 13:17 | 
        гляньте свежим взглядом где я мог ошибиться     | |||
| 22
    
        Вафель 24.06.21✎ 13:50 | 
        Штрих вначеле нужно в 16 перевести     | |||
| 23
    
        aptomilov 24.06.21✎ 13:58 | 
        011,1 232
 стало ближе но все равно не то | |||
| 24
    
        aptomilov 24.06.21✎ 13:58 | 
        я вот думаю может эти  1с ные пробелы воду мутят между цифрами     | |||
| 25
    
        aptomilov 24.06.21✎ 14:02 | ||||
| 26
    
        Вафель 24.06.21✎ 14:05 | 
        А верно ли ты в hex преобразовал?     | |||
| 27
    
        aptomilov 24.06.21✎ 14:09 | 
        онлайн калькулятор говорит что да верно 
 глянул на сайте там похожу чуть больше чем преобразование var codeInt = parseInt(instr,10); var codeHex = codeInt.toString(16); var codeHex = ("000000" + codeHex).slice(-6); | |||
| 28
    
        aptomilov 24.06.21✎ 14:18 | 
        Штрих = "1234567890128";
 codeInt = Число(Штрих); codeHex = Из_Число_В_XСчисл(codeInt,"0123456789ABCDEF"); Штрих= Прав("000000" + codeHex,6); //11F71FB04D0 верно // var codeHex = instr.substring(4,6) + instr.substring(2,4) + instr.substring(0,2); //456 234 12 codeHex = ВРег(Штрих);; l = СтрДлина(Штрих); //codeHex = instr.toUpperCase(); //l = codeHex.length; codeP1 = Лев(codeHex,l-4); codeP2 = Сред(codeHex,l-4+1); // var codeP1 = codeHex.substring(0,l-4); // var codeP2 = codeHex.substring(l-4); codeP1I= ПеревестиЧислоИзШестнадцатиричногоВДесятичное(codeP1); codeP2I= ПеревестиЧислоИзШестнадцатиричногоВДесятичное(codeP2); // codeP1I = parseInt(codeP1,16); //codeP2I = parseInt(codeP2,16); codeText = Прав("000" + codeP1I,3) + "," + Прав("00000" + codeP2I,5); //codeText = ("000" + codeP1I).slice(-3) + ',' + ("00000" + codeP2I).slice(-5); //251,1232 - так получается ноль где то пропал //251,01232 - так должно получиться | |||
| 29
    
        Вафель 24.06.21✎ 14:19 | 
        Формат сделай, ибо пробел съел символ     | |||
| 30
    
        aptomilov 24.06.21✎ 14:53 | 
        Всем кто помогал опыт в целом интересный функция работает как надо     | |||
| 31
    
        Вафель 24.06.21✎ 14:58 | 
        выложи последний вариант сюда     | |||
| 32
    
        aptomilov 24.06.21✎ 15:03 | 
        Функция Преобразование(Штрих)  Экспорт  // работает с железом sigur только на  13 символах(штрихкод) на 12 уже не работает
 codeInt = Число(Штрих); codeHex = Из_Число_В_XСчисл(codeInt,"0123456789ABCDEF"); Штрих = Прав("000000" + codeHex,6); codeHex = ВРег(Штрих);; l = СтрДлина(Штрих); codeP1 = Лев(codeHex,l-4); codeP2 = Сред(codeHex,l-4+1); codeP1I = СтрЗаменить(Строка(ПеревестиЧислоИзШестнадцатиричногоВДесятичное(codeP1)), Символы.НПП, ""); codeP2I = СтрЗаменить(Строка(ПеревестиЧислоИзШестнадцатиричногоВДесятичное(codeP2)), Символы.НПП, ""); codeText = Прав("000" + codeP1I,3) + "," + Прав("00000" + codeP2I,5); Возврат codeText; КонецФункции // Функия переводит число переданное в параметре // Значение в строку (либо число) в системе счисления X // X определяется линой шаблона, представление знаков разрядов // значение шаблона, где сивол шаблона[k] - есть представление // Например если шаблок "01", то перевод будет осуществлен в двоичную // систему счисления, если "01234567", то в восьмиричную // если "0123456789ABCDEF", то в шестнадцатиричную // если "ЛИ", то в двоичную, где 0 представлен буквой Л, а 1 буквой И // вариант шаблона: // "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwzyzАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдежзийклмнопрстуфхцчшщьыъэюя!@#$%^&*()_-=+{}[]\|/,.:;'""><" // представит Значение в сто пятидесятишести ричной системе счисления, // где соответствующий символ шаблона означает соответствующую цифру разряда Функция Из_Число_В_XСчисл(Знач Значение, Шаблон) Результат=""; Основание = СтрДлина(Шаблон); Пока Значение>0 цикл Остат = Значение%Основание; Результат1=Сред(Шаблон,Остат+1,1); Значение = (Значение-Остат)/Основание; Результат = Результат1 + Результат; КонецЦикла; Возврат Результат; КонецФункции Функция ПеревестиЧислоИзШестнадцатиричногоВДесятичное(пHex) Экспорт Разрядность = 16; пHex = СокрЛП(пHex); МаксСтепень = СтрДлина(пHex) - 1; ч10Число = 0; счСимв = 1; Пока МаксСтепень >=0 Цикл пHexСимвол = Сред(пHex, счСимв, 1); ПредставлениеHex = Найти("0123456789ABCDEF", пHexСимвол) - 1; ч10Число = ч10Число + ПредставлениеHex * Pow(Разрядность, МаксСтепень); МаксСтепень = МаксСтепень - 1; счСимв = счСимв + 1; КонецЦикла; Возврат ч10Число; //Десятичное число (Число) КонецФункции | |||
| 33
    
        aptomilov 24.06.21✎ 15:08 | 
        Можно к стати доработать ее что бы работала на любом количество символов     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |