|
Конвертация десятичного числа в 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
|
Можно к стати доработать ее что бы работала на любом количество символов
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |