Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Конвертация десятичного числа в Wiegand 34

Конвертация десятичного числа в Wiegand 34
Я
   aptomilov
 
24.06.21 - 10:04
Возникла такая необходимость из 1с складывать в базу скуд штрих в родном формате Wiegand 34
Опыты показали что при сканировании штрихкода 1234567890128 получаем в базе цихру 251,01232. Пока не могу понять алгоритм преобразования
Может кто сталкивался ?
   Bigbro
 
1 - 24.06.21 - 10:07
я сталкивался с задачами аппроксимации, в простых случаях по 2 точкам построить прямую.
но так чтобы по одной точке... ))))
   aptomilov
 
2 - 24.06.21 - 10:08
460123456788 - 243,45774,
460123456789 - 243,45781
   Вафель
 
3 - 24.06.21 - 10:09
   aptomilov
 
4 - 24.06.21 - 10:11
(3) видел я его он вообще не те цыхры выдает
   Вафель
 
5 - 24.06.21 - 10:11
   Вафель
 
6 - 24.06.21 - 10:12
на (0) верно работает
   aptomilov
 
7 - 24.06.21 - 10:12
460123456790 - 243,45797
   aptomilov
 
8 - 24.06.21 - 10:15
(6) там я смотрю прям в оборудовании
(5) а вот этот работает надо попробовать теперь алгоритм увидеть
   Garykom
 
9 - 24.06.21 - 10:17
(0) "Wiegand-34. Состоит из 32 бит кода и 2 бит контроля на четность."
   Garykom
 
10 - 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;
}
   aptomilov
 
12 - 24.06.21 - 10:23
только хотел вставить )) 
осталось на 1С переписать
   aptomilov
 
13 - 24.06.21 - 12:06
codeP1I = parseInt(codeP1,16);
Знает кто нибудь аналог это функции в 1с 8
   Вафель
 
14 - 24.06.21 - 12:11
Это конвертация из 16 в 10
   NorthWind
 
15 - 24.06.21 - 12:15
(13) можно написать самому. Алгоритм несложный.
   Вафель
 
16 - 24.06.21 - 12:16
В цикле
С = с + хi * 16
   Вафель
 
17 - 24.06.21 - 12:16
16^i
   aptomilov
 
18 - 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Число;//Десятичное число (Число)

 КонецФункции
   aptomilov
 
19 - 24.06.21 - 12:38
вот эта верно считает нашел еще несколько не тот результат
   aptomilov
 
20 - 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    - так должно получиться
   aptomilov
 
21 - 24.06.21 - 13:17
гляньте свежим взглядом где я мог ошибиться
   Вафель
 
22 - 24.06.21 - 13:50
Штрих вначеле нужно в 16 перевести
   aptomilov
 
23 - 24.06.21 - 13:58
011,1 232

стало ближе но все равно не то
   aptomilov
 
24 - 24.06.21 - 13:58
я вот думаю может эти  1с ные пробелы воду мутят между цифрами
   aptomilov
 
25 - 24.06.21 - 14:02
в эмуляторе ява скрипта тот же результат 

http://joxi.ru/12MPQoiwgVQGmJ
   Вафель
 
26 - 24.06.21 - 14:05
А верно ли ты в hex преобразовал?
   aptomilov
 
27 - 24.06.21 - 14:09
онлайн калькулятор говорит что да верно 
глянул на сайте там похожу чуть больше чем преобразование

var codeInt = parseInt(instr,10);
    var codeHex = codeInt.toString(16);
    var codeHex = ("000000" + codeHex).slice(-6);
   aptomilov
 
28 - 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
Формат сделай, ибо пробел съел символ
   aptomilov
 
30 - 24.06.21 - 14:53
Всем кто помогал опыт в целом интересный функция работает как надо
 
 
   Вафель
 
31 - 24.06.21 - 14:58
выложи последний вариант сюда
   aptomilov
 
32 - 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Число;//Десятичное число (Число)

КонецФункции
   aptomilov
 
33 - 24.06.21 - 15:08
Можно к стати доработать ее что бы работала на любом количество символов


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.