Декодиране (декодиране) на баркода на OMC политиката (част 1)

тайни на програмирането

Преди почти повече от година започнах запознаването си със системата CHI. По това време си намерих работа в застрахователна компания, занимаваща се със задължителна медицинска застраховка. Основната задача беше да се подредят нещата при отчитането на полиците в компанията.
Първоначално беше необходимо да се изготви схема за обработка и разпространение на полици по отдели в региона, която дойде в нашата компания от Териториалния фонд за задължително медицинско осигуряване (TFOMI). Препъни камъкът е декодирането на баркода от OMS политиката.
Започнах да търся информация в Интернет и TFOMS. Резултатите бяха плачевни, информация от носа на Гулкин. Мина време, разбрах го, написах DLL, за да декодирам баркода на политиката. Заради празен интерес започнах да търся в Google, може би някой е писал за опита си по тази тема. И каква беше изненадата ми, когато намерих куп въпроси и теми във формулярите - но НИКАКЪВ НОРМАЛЕН ОТГОВОР.
Информацията е необходима, за да бъде споделена и затова реших да я споделя. Не ме съдете строго по тази статия. Оказа се голям, но се опитах да опиша всичко, което знам по тази тема.
Моля, когато използвате материала на тази статия, посочете обратната връзка към сайта.

Първо: оборудване ...

Нека започнем с оборудването за сканиране на баркода на политиката. Ще ни трябва 2D скенер за баркод. Използвам Honeywell Xenon 1900. Скенерът е отличен, в ръководството за скенера има баркод, който трябва да се прочете от него и той ще започне да емулира връзка на com порт.

политиката
Скенер Honeywell Xenon 1900

Опитах и ​​скенера за баркод Metrologic MS9520, честно казано, не ми даде добър резултат. Тогава нямаше време да разглобявам каква точно беше причината, затова избрах Xenon 1900. По отношение на цената скенерите не се различават особено. Заключение едно купуване на ксенон Honeywell 1900. Инвестирайте веднъж и няма да познаете скръбта.

Второ: Описание на баркода ...

Структурата на баркода на политиката на OMC се състои от 131 байта (знака). Ако просто сканирате баркод със скенер и го покажете в бележник, там ще видите „krakozyabra“. Защо се случва?

Факт е, че данните са криптирани (компресирани) и скенерът вижда набор от символи, които Windows просто не може да покаже в бележника. Помислете какво вижда скенерът в „суров“ вид.

Тип баркод на OMC политиката

Първите 3 байта са от типа баркод. Не съм срещал описание на това като такова в GOST. Има само два вида баркодове: "010" и "020", как се различават тези два вида, ще говорим по-долу.
Унифициран номер на политика (UNP) OMC
От 4 до 9 символът (байтове) се кодира от EPP. EPP се декодира в следния ред:

1. Вземаме първия знак, получаваме кода на символа от таблицата ASCII (10 числова система).
2. Превеждаме числовата система в 16.
3. Записваме, след това вземаме следващия знак, повтаряме 1 и 2 точки и записваме полученото число до предишния.
4. Така прекодираме всички знаци от 4 до 9. В резултат на това получаваме огромен брой в 16 цифрова система, която, ако се преведе в 10 цифрова система, получаваме ENP.
НО, както трябва да знаете, първите две цифри на EPP са регионалният код. Има региони, които започват от нулата. Например "02" се нарича водеща нула. С този метод за компресиране на EPP, водещата нула се губи, така че трябва да проверите на изхода, ако EPP е 15 знака, трябва да добавите водещата нула.
Кодът за дешифриране на EPP в Delphi е както следва.

По този начин се декодира ЕНП. Общо анализирахме само от 1 до 10 байта и има само 131 от тях.

Декодиране на фамилното име, собственото име, бащиното име от баркода на политиката на OMC

Не забравяйте, че по-горе писах за два вида баркодове - „020“ и „010“. Така че те значително влияят на алгоритмите за декодиране (декодиране в бъдеще.) Ще ви кажа най-общо, след това ще дам примери за кодове.
Тип "010".
Пълното име е написано от 11 до 52 знака (байта). И това се прави в огледален образ. Например (по символни кодове):
35 56 06 67 6А 8F 5D DF ... - както е записано в баркода на полицата OMC, огледално
DF 5D 8F 6A 67 06 56 35 - декодиране до нормално и получаване:
ANVONITNATSNOK | ANILOP | AVENLASH - това е пълното име в огледален образ, тоест ние го пренаписваме от край до начало и получаваме дългоочакваното Фамилия, Име, Отчество от политиката на OMS
ШАЛНЕВА | ПОЛИНА | КОНСТАНТИНОВНА. В GOZNAK работят жестоки перверзници
Тип "020".
Пълното име е написано от 11 до 61 знака (байта). И няма повече "огледален скок". Например (кодове на символи):
DF 5D 8F 6A 67 06 56 35 - декодирайте в нормална форма и вземете:
ШАЛНЕВА | ПОЛИНА | КОНСТАНТИНОВНА.
Както можете да видите, има разлики, които силно влияят на цялата поръчка. Ако само знаехте колко нерви съм изхабил, докато чрез експерименти и глупав анализ на редове под формата на символни кодове не открих този модел. Е, нека не говорим за тъжни неща.
Ще ви разкажа малко за декодирането (декодирането) на самия низ от баркода. Същността на метода е приблизително както следва:
1. Получаваме символния код в 8-мата числова система.
2. Вземете първите 6 байта и преобразувайте числото в 16.
3.16 числа са представени като два знака, като ги използваме и таблицата на съответствието, ние определяме кодирания знак.
Най-общо казано, декодирането се извършва съгласно горния алгоритъм. (Благодаря на Михаил Станин за помощта при изпълнението на тази част).
Сега самият код:

Получаваме пола, датата на раждане и (срок на годност на полицата - ако има такъв)

Поради факта, че в зависимост от вида на баркода на политиката на OMC, диапазонът от знаци (байтове) за пълното име е различен, местоположението на останалите данни се променя. Полът е представен като един знак (байт):
1-Мъжки;
2-женски.
За типа баркод на политиката „010“ това е 53 знака. В типа баркод "020" полът се записва в 62 знака.

Датата на раждане и срок на валидност на полицата се кодира с броя на дните от 01/01/1900 до датата на раждане/изтичане на полицата. Датите се пишат с два знака, декодирането следва същия принцип като EPP.
По-долу е даден само примерен код:

Нарисувах всичко според структурата на баркода, останалите символи са EDS - електронният цифров подпис на полицата. Във всеки случай е написано в GOST. Ще опиша как това се изпълнява под формата на dll в следващата статия.