Декодування (розшифрування) штрих-коду полісу ОМС (частина 1) - Shinobi

таємниці програмування

Майже понад рік тому я розпочав своє знайомство із системою ЗМС. Тоді я влаштувався працювати у страхову компанію, що займається ЗМС. Першорядним завданням було навести лад в обліку полісів усередині компанії. Спочатку потрібно було придумати схему обробки та розподілу полісів по відділеннях в області, які надходили до нас у компанію з Територіального Фонду Обов'язкового Медичного Страхування (ТФОМС). Каменем спотикання було декодування штрих-коду з полісу ЗМС. Я почав шукати інформацію в інтернеті та ТФОМС. Результати були плачевні, інформації з Гулькін ніс. Минув час, я розібрався, написав dll для декодування штрих-коду полісу. Заради цікавості став шукати в гугле, може хтось написав про свій досвід на цю тему. І яке ж було моє здивування, коли я виявив купу питань і тим на формах — але ЖОДНОГО НОРМАЛЬНОГО ВІДПОВІДІ. Інформація потрібна для того, щоб їй ділилися, і ось я вирішив поділитися їй. Не судіть мене за цією статтею. Вона вийшла велика, але я спробував описати все, що знаю з цієї теми. Прохання, при використанні матеріалу дана стаття вказувати зворотне посилання на сайт.

Перше: Устаткування.

Почнемо насамперед із обладнання для сканування штрих-коду поліса. Нам знадобиться двовимірний сканер штрих-кодів. Я використовую Honeywell Xenon 1900. Відмінний сканер, в мануалі до сканера є штрих-код, який потрібно їм вважати і він почне емулювати підключення по com-порту.

полісу
Сканер Honeywell Xenon 1900

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

Друге: Опис штрих-коду.

Структура штрих-коду полісу ОМС складається з 131 байта (символу). Якщо ви скануєте просто штрих-код сканером і виведіть в блокнот, то там побачите «кракозябру». Чому так відбувається?

Справа в тому, що дані зашифровані (стиснуті), і сканер бачить набір символів, які Windows просто не може відобразити в блокноті. Розглянемо, що бачить сканер у «сирому вигляді».

Тип штрих-коду полісу ОМС

Перші 3 байти – це тип штрих-коду. Опису цього як такого в ГОСТі я не зустрів. Типів штрих-кодів всього два: "010" і "020", чим відрізняються ці два типи ми поговоримо нижче.Єдиний номер полісу (ЄНП) ОМС З 4 по 9 символ (б) закодований ЄНП. ЄНП розкодується так: 1. Беремо перший символ, отримуємо код символу таблиці ASCII (10 системі числення ). 2. Перекладаємо у 16 ​​систему числення. 3. Записуємо, потім беремо наступний символ, повторюємо 1 і 2 пункти та отримане число записуємо поруч із попереднім. 4. Так перекодуємо всі символи з 4 по 9. У результаті отримуємо величезне число в 16 системі числення, яке, якщо перевести в 10 систему числення, то отримаємо ЄНП. АЛЕ, як має бути ви знаєте, перші дві цифри ЄНП – це код регіону. Є регіони, що починаються з нуля. Наприклад, «02» -це називається лідируючий нуль. При даному методі стиснення ЕНП лідируючий нуль втрачається, тому потрібно перевіряти на виході, якщо ЕНП дорівнює 15 символів, потрібно додавати нуль, що лідирує. Код розшифровки ЄНП мовою Delphi виглядає так.

Ось так декодується ЄНП. Разом ми розібрали всього з 1 по 10 байт, аїх лише 131.

Декодування Прізвища, Імені, По-батькові зі штрих-коду полісу ОМС

Пам'ятайте, я писав про два типи штрих коду - "020" і "010". Так ось вони значно впливають на алгоритми розкодування (декодування надалі.) Розкажу загалом, потім наведу приклади коду. Тип «010». ПІБ записано з 11 по 52 символ (байт). Причому це зроблено дзеркально. Наприклад (кодами символів): 35 56 06 67 6А 8F 5D DF… – так записано у штрих-коді поліса ОМС, відбиваємо дзеркально DF 5D 8F 6A 67 06 56 35 – декодуємо у нормальний вигляд і отримуємо: АНВОНІТНАТСНОКАНІЛОПАВЕНЬЛАШ – це ПІБ у дзеркальному відображенні, тобто переписуємо з кінця в початок і отримуємо довгоочікуване Прізвище, Ім'я, По батькові з полісу ОМС ШАЛЬНЕВАПОЛІНАКОНСТАНТИНІВНА. У ГОЗНАКу працюють жорстокі збоченці Тип «020». ПІБ записано з 11 по 61 символ (байт). Причому більше жодної «дзеркальної чехарди». Наприклад (кодами символів): DF 5D 8F 6A 67 06 56 35 – декодуємо в нормальний вигляд і отримуємо: ШАЛЬНЕВАПОЛІНАКОНСТАНТИНІВНА. Як бачите, є відмінності, що сильно впливають на весь порядок. Чи знали б ви скільки нервів я витратив, поки шляхом експериментів і тупого аналізу рядків у вигляді кодів символів, я виявив цю закономірність. Ну не будемо про сумне. Трохи розповім про декодування (розкодування) самого рядка зі штрих-коду. Суть методу приблизно така: 1. Отримуємо код символу в системі 8 обчислення. 2. Беремо перші 6 байт і переводимо число до 16 системи числення. 3. 16 числа подаються у вигляді двох символів, використовуючи їх та таблицю відповідностей, визначаємо закодований символ. Загалом розкодування відбувається за вище описаним алгоритмом. (Дякую за допомогу у реалізації цієї частини Михайлу Станіну). Тепер власне сам код:

Отримуємо стать, дату народження і (дату закінчення поліса – якщо вона є)

Внаслідок того, що в залежності від типу штрих-коду полісу ЗМС, діапазон символів (байт) для ПІБ різний, змінюється розташування інших даних. Підлога представлена ​​у вигляді одного символу (байта): 1-Чоловічий; 2-Жіночий. Для типу штрих-коду поліса "010", це 53 символ. У штрих-коді типу «020» підлога записана у 62 символі.

Дата народження та дата закінчення дії поліса кодується кількістю днів від 01.01.1900 р. до дати народження/закінчення поліса. Дати записані у двох символах, декодування йде за тим самим принципом, як і ЄНП. Нижче наведу просто приклад коду:

За структурою штрих-коду я все розписав, решта символів – це ЕЦП – електронно-цифровий підпис поліса. Принаймні так написано в ГОСТі. Про те, як це реалізується у вигляді dll, я розпишу в наступній статті.