# Принцип декодирования с накладыванием маски на примере использования карт Mifare и Em-marine

Декодирование на стороне TCPCardReader'a включается строкой

```
useDecodeCards=1  
```

в TCPCardReader.ini в настройках конкретного считывателя:

```
[READER1]
COMPORT=6
COMPORTPARAMS=baud=9600 data=8 parity=N stop=1
Prefix=;
Postfix=?
useDecodeCards=1
StartTermChars=i
FinishTermChars=?#13;#10;#0;
```

Таким образом при включении декодирования TCPCardReader отправляет часть трека начинающегося с символа следующего за *StartTermChars* и заканчивающимся символом стоящим перед одним из *FinishTermChars в* Decodecards*.*

Итак Decodecards получает только эту часть и декодирует (преобразовывает/выделяет идентификатор) её.

В **decodecards.ini** В секции **\[mask\]** перечисляются маски по префиксам которых можно разделять декодирование разных карт

```
[mask]
card_em = ne*
card_mifare = fare*
card = *
```

В данном примере если пришедший от TCPCardReader'a трек содержит префикс "ne" ,то обработка такого трека будет описана в секции \[cards.**card\_em**\]. Соответственно если трек содержит префикс "fare" то обработка такого трека описана в секции \[cards.card\_mifare\]. Символ "\*" в данном случае означает любое количество символов.

<p class="callout warning">`Чтение данной секции происходит последовательно, то есть при первом совпадении пришедшего трека с маской дальнейшей просмотр секции не ведётся`</p>

Далее в секциях с названием "cards." и левой частью до знака равенства в секции \[mask\] конкретного типа трека настраивается декодирование.

```
[cards.card_em]
ExcludedPrefix=ne[
code=2
CardDecodeType = MASK
mask=****dddddddd
DecodeTypeEx = 0
```

  
Опцией CardDecodeType = MASK выбираем алгоритм декодирования с накладыванием маски.

Сначала удаляется часть не участвующая в декодировании используя параметр ExcludedPrefix.

Далее происходит декодирование(выделение трека) применением маски **mask=.**

```
mask=****dddddddd
```

Здесь \* означает любой один символ который игнорируется.

Символы "d" или "h" означают систему счисления в которой пришел в decodecards.

h - HEX 16-тиричная (Hexadecimal)

d - DEС 10-тиричная (Decimal)

В этом примере обрабатываются первые 12 символов(их может быть больше 12 в пришедшем треке) из которых первые 4 игнорируются, а следующие 8 воспринимаются как десятичное число. Если на их месте появляется символ который не возможно преобразовать к числу в десятичной системе счисления декодирование произойдет с ошибкой и Декодер вернет "0" в качестве трека.

В случае если трек приходит в 16-теричной системе (например у карт Mifare) в маске необходимо использовать уже символы h чтобы Декодер воспринимал трек как 16-ричный.

```
mask=****hhhhhhhh
```

После применения маски получается трек который всегда будет в 10-тичной системе независимо от исходной системы и он уже вернется в TcpCardReader. Далее TCPCardReader обрамит этот трек префиксом "Prefix=;" и суффиксом "Postfix=?" и отправит клиентам.

Готовый пример Dodecoder.ini для карт E-marine и Mifare:

```
[frf]
fsUnit=fsdecodecard.upas

[general]
usemask=1
TrackResultLog=

[mask]
  card_mi = fare*
  card_em = ne*

[cards.card_mi]
ExcludedPrefix=fare[
code=2
CardDecodeType = MASK
mask=hhhhhhhh
DecodeTypeEx = 0

[cards.card_em]
ExcludedPrefix=ne[
code=2
CardDecodeType = MASK
mask=****dddddddd
DecodeTypeEx = 0
```