Текст книги "Магнитные карты и ПК"
Автор книги: Патрик Гёлль
сообщить о нарушении
Текущая страница: 4 (всего у книги 6 страниц)
Большая длительность в значительной степени облегчает работу программ на не слишком быстродействующем или с замедленным выполнением других задач процессоре.
Общий вид декодера приведен на рис. 3.25 и 3.26.
Рис. 3.25. Общий вид декодера со стороны размещения элементов
Рис. 3.26. Общий вид декодера со стороны печати
Американская версия
Схема, представленная на рис. 3.27, значительно отличаясь от рассмотренной выше, приводит к очень близким результатам.
Рис. 3.27. Схема декодера на интегральной схеме фирмы American Magnetics
Основные функциональные отличия заключаются в следующем:
• значительно более высокая чувствительность, допускающая использование менее качественной или не очень хорошо настроенной головки;
• несколько меньший допуск к очень низким скоростям прохождения;
• импульс имеет фиксированную длительность (приблизительно 23 мкс), то есть более короткую, чем в предыдущем случае при нормальных условиях работы;
• идентичные величины внешних компонентов для дорожек для плотностей записи как 75, так и 210 bpi;
• данные выдаются без инверсии.
Последняя особенность приводит к необходимости ставить инвертирующий каскад для линии с целью обеспечения совместимости с предыдущей схемой и большинством промышленных считывающих устройств.
Поскольку каскад выполнен на обычном n-р-n транзисторе, ему дня нормальной работы требуется форсирующая RC-цепочка в цепи базы. Отсутствие такого конденсатора может привести к межсимвольной интерференции, то есть наложению текущих битов на последующие.
Следует отметить, что количество диодов в цепи отрицательной обратной связи при необходимости и в экспериментальных целях может варьироваться.
Обратим внимание и на то, что номиналы всех элементов были оптимизированы в соответствии с указаниями изготовителя интегральной схемы; в принципе рекомендуется их придерживаться. Печатная плата декодера, изображенная на рис. 3.28, также имеет небольшие размеры и допускает установку в непосредственной близости от головкодержателя.
Рис. 3.28. Печатная плата декодера на ИС фирмы American Magnetics
Напомним, что длина проводов, подсоединяющих головку к декодеру, не должна превышать 10 см, причем неважно, будет ли это витая пара или отдельные экранированные провода (поскольку вход усилителя симметричен, ни один из двух проводов головки не соединяется с «землей»).
Размещение элементов на плате декодера представлено на рис. 3.29. Здесь мы также частично обращаемся к технологии поверхностного монтажа (SMD).
Рис. 3.29. Размещение элементов на плате декодера, использующего ИС фирмы American Magnetics
Интегральная схема припаивается со стороны печати так же, как и форсирующий конденсатор 47 нФ, включенный параллельно с резистором 18 кОм. В качестве данного конденсатора целесообразно использовать конденсатор в стеклянном корпусе, похожий на диод. Это гарантирует минимальную длину соединений и экономит место со стороны компонентов.
Внешний вид декодера приведен на рис. 3.30 и 3.31, а перечень элементов – в табл. 3.3.
Рис. 3.30. Вид декодера со стороны размещения элементов
Рис. 3.31. Вид декодера со стороны печати
Таблица 3.3. Перечень элементов декодера
ПРОГРАММЫ ДЛЯ СЧИТЫВАЮЩИХ УСТРОЙСТВ
Несмотря на то что промышленные считывающие устройства для магнитных карт или считывающие устройства, построенные по нашим рекомендациям, могут быть использованы практически с любым процессором, мы разработали программы, позволяющие выполнять все вышеназванные исследования как обычно, на IBM РС-совместимом компьютере.
Подключение чрезвычайно просто, не затрагивает существующей конфигурации и использует порт для игровых приставок или джойстика.
Этот разъем типа DB15, которым, как правило, пренебрегают серьезные пользователи, предоставляет четыре логических входа для импульсных сигналов и весьма удобное напряжение питания + 5 В.
Этого более чем достаточно для подключения считывающего устройства магнитных карт. Схема подключения приведена на рис. 3.32.
Рис. 3.32. Подключение считывающего устройства к разъему джойстика ПК
Длина соединительных проводов (неэкранированных) не принципиальна и может достигать 1 м, по крайней мере в случае декодеров, построенных в соответствии с нашими схемами.
Считывание дорожки ISO 2
Логично сначала заинтересоваться именно этой дорожкой, расположенной посередине, поскольку она одновременно и наиболее используемая, и самая легкая в интерпретации. Даже при плотности 75 bpi сигналы, поступающие от декодера, могут быть достаточно высокой частоты.
Не доходя до программирования на ассемблере, нам пришлось использовать язык, известный своим быстродействием, – Turbo Pascal. Даже в этих условиях не стоит надеяться обойтись компьютером с производительностью ниже, чем у 386SX25, чьих возможностей едва хватает.
На сайте издательства www.dmk.ru содержатся исходный текст программы LECT75.PAS, приведенный выше, и соответствующий исполняемый файл LECT75.EXE. Эта программа создает файл CARTE.CAR, содержащий данные, считанные с дорожки, – 240 бит.
Это 48 раз по 5 бит, то есть 40 полезных знаков, которые максимально может содержать дорожка ISO 2, и 40 бит нулей заполнения, избыток которых не важен.
Формат этого файла (.CAR) мы определили уже несколько лет назад для считывания чип-карт; текст в коде ASCII, состоящий исключительно из 1 и 0, разделенных пробелами. С учетом линейной структуры магнитных дорожек никакого разбиения ни на группы битов, ни на строки фиксированной длины предусмотрено не было. Преобразование двоичных данных в цифровые символы, а также другие интересные анализы будут доверены другим программам, написанным на GWBASIC. Программа предполагает, что адрес порта игровой приставки – 513 (в десятичной системе); это имеет место для всех действительно IBM PC-совместимых ПК.
После запуска программа ожидает момента, когда карта будет вставлена в считывающее устройство. Затем начинается процесс считывания информации, и после считывания 240 бит раздается звуковой сигнал. Отсутствие звукового сигнала свидетельствует, что было получено менее 240 бит: это означает некачественное считывание либо то, что карта не полностью запрограммирована.
В подобном случае необходимо вставить карту вторично. Если блокировка продолжается, воспользуйтесь другой картой, которая уже считывалась с первого раза. Чтобы непосредственно получить отображение содержимого дорожки в битовом виде, в оболочке из основной программы LECTISO2.BAS посредством строки 30 вызывается внешняя программа LECT75.EXE. При этом, конечно, необходимо, чтобы программа COMMAND.СОМ была доступна через путь поиска PATH, в котором должна быть соответствующая запись, либо просто скопирована в текущую директорию.
Обратите внимание, что все эти программы были написаны специально для работы в DOS. Рекомендуется воздержаться от их запуска через Windows (в окне DOS), поскольку это может замедлить их выполнение.
В некоторых случаях предпочтительно дезактивировать некоторые резидентные программы, например ЕММ 386. Пользователи PC, привыкшие работать в Windows (версия не имеет значения), должны закрыть эту операционную систему, прежде чем приступить к выполнению программ.
10 REM – LECTISO2.BAS —
20 KEY OFF: CLS: PRINT: PRINT: PRINT: PRINT
30 SHELL «LECT75.EXE»
40 OPEN «carte.car» FOR INPUT AS #1
50 DIM T(240)
60 FOR F=1 TO 240
70 INPUT#1,T(F)
80 NEXT F
90 J=1
100 IF T(J)<>1 THEN 160
110 IF T(J+1)<>1 THEN 160
120 IF T(J+2)<>0 THEN 160
130 IF T(J+3)<>1 THEN 160
140 IF T{J+4)<>0 THEN 160
150 K=J: GOTO 200
160 J=J+1: GOTO 100
200 C$=""
210 FOR F=0 TO 4
220 IF T(K+F) =0 THEN C$=C$+"0"
230 IF T(K+F) =1 THEN C$=C$+"1"
240 NEXT F
250 GOSUB 2000
260 K=K+5: IF K>235 THEN END
270 GOTO 200
2000 IF C$="11010* THEN PRINT «{start}»
2010 IF C$="10110" THEN PRINT «{sep}»
2020 IF CS="11111" THEN PRINT «{end}»
2030 IP C$="01011" THEN PRINT «{10}»;
2040 IF C$="00111" THEN PRINT «{12}»;
2050 IF C$="01110" THEN PRINT «{14)»;
2060 IF C$="00001" THEN PRINT "0";
2070 IF C$="10000" THEN PRINT "1";
2080 IF C$="01000" THEN PRINT "2";
2090 IF C$="11001" THEN PRINT "3";
2100 IF C$="00100“ THEN PRINT "4";
2110 IF C$="10101" THEN PRINT "5";
2120 IF C$="01101" THEN PRINT "6";
2130 IF C$="11100" THEN PRINT "7";
2140 IF C$="00010" THEN PRINT "8";
2150 IF C$="10011" THEN PRINT "9";
2170 RETURN
3000 REM (c) 1996 Patrick GUEULLE
Программа LECTISО2.BAS – основная программа, которую вы будете использовать для считывания дорожки ISO 2 стандартных магнитных карт. Если LECT75.EXE присутствует в текущей директории (наряду с COMMAND.COM), то любое прохождение читаемой карты (в правильном направлении) должно привести к отображению 240 считанных бит и соответствующих цифровых данных.
Ниже показано, что это дает в конкретном случае с файлом TEST5.CAR, представленным на сайте www.dmk.ru. Так, файл TEST5.CAR, декодированный с помощью программы LECTISО2.BAS, будет иметь следующий вид:
Одновременно создается файл CARTE.CAR, который нетрудно переименовать в DOS (командой REN), если есть желание его сохранить. Ни один из тестов (на четность или LRC) не производится.
Такие проверки можно осуществить по запросу при необходимости (дальше будут представлены соответствующие программы). Однако при этом существует риск сбоя в считывании некоторых нестандартных карт.
При отображении данных, записанных на дорожке, используются не стандартные «кабалистические* знаки, представленные выше в виде пяти– и семибитного кода ANSI, а знаки в более наглядной форме:
• флажок начала: {start};
• разделитель полей: {sep};
• флажок конца: {end};
• специальные знаки: {10}, {12} и {14}.
Внимание: не путайте эти фигурные скобки с простыми!
Считывание дорожки ISO 1
Работать с дорожкой ISO 1 несколько сложнее, поскольку обычно она записана с плотностью 210 bpi и содержит семиразрядные коды алфавитно-цифровых символов.
Осуществить считывание позволяет программа LECT210.PAS, которая работает аналогично LECT75.PAS. Ее исполняемая версия (LECT210.EXE) может использоваться либо самостоятельно для создания файла CARTE.CAR на 630 бит, либо вызываться из другой программы в оболочке Basic.
Отметим, что 630 бит – это 90 раз по 7 бит, то есть они соответствуют 79 знакам, которые максимально может содержать дорожка ISO 1, плюс 77 нулей заполнения.
10 REM – LECTISO1.BAS —
20 KEY OFF: CLS: PRINT: PRINT: PRINT: PRINT: PRINT: PRINT: PRINT: PRINT: PRINT
30 SHELL «LECT210.EXE»
40 OPEN «carte.car» FOR INPUT AS #1
50 DIM T(630)
60 FOR F=1 TO 630
70 INPUT#1,T(F)
80 NEXT F
90 J=1
100 IF T(J)<>1 THEN 160
110 IF T(J+1)<>0 THEN 160
120 IF T(J+2)<>1 THEN 160
130 IF T(J*3)<>0 THEN 160
140 IF T(J+4)<>0 THEN 160
141 IF T(J+5)<>0 THEN 160
142 IF T(J+6)<>1 THEN 160
150 K=J: GOTO 200
160 J=J+1:GOTO 100
200 C$=""
210 FOR F=0 TO 6
220 IF T(K+F) =0 THEN C$=C$+"0"
230 IF T(K+F)=1 THEN C$»C$+"1"
240 NEXT F
250 GOSUB 2000
260 K=K+7: IF K>623 THEN END
270 GOTO 200
2000 IF C$="1010001" THEN PRINT «{start}»
2010 IF C$="0111110" THEN PRINT «{sep}»
2020 IF C$="1111100" THEN PRINT «{end}»
2030 IF C$="0000001" THEN PRINT " ";
2031 IF C$="1000000" THEN PRINT «{1H}»;
2032 IF C$="0100000" THEN PRINT «{2H}»;
2033 IF C$="1100001" THEN PRINT «{3H}»;
2034 IF C$="0010000" THEN PRINT «{4H}»;
2036 IF C$="0110001" THEN PRINT «{6H}»;
2037 IF C$="1110000" THEN PRINT «{7H}»;
2038 IF C$="0001000" THEN PRINT «{8H}»;
2039 IF C$="1001001" THEN PRINT «{9H}»;
2040 IF C$="0101001" THEN PRINT «{AH}»;
2041 IF C$="1101000" THEN PRINT «{BH}»;
2042 IF C$="0011001– THEN PRINT «{CH}»;
2043 IF C$="1011000– THEN PRINT «{DH}»;
2044 IF C$="0111000" THEN PRINT «{EH}»;
2045 IF C$="1111001" THEN PRINT «{FH}»;
2060 IF C$="0000100" THEN PRINT "0";
2070 IF C$="1000101" THEN PRINT "1";
2080 IF C$="0100101" THEN PRINT "2";
2090 IF C$="1100100" THEN PRINT "3";
2100 IF C$="0010101" THEN PRINT "4"
2110 IF C$="1010100" THEN PRINT "5"
2120 IF C$="0110100" THEN PRINT "6";
2130 IF C$="1110101" THEN PRINT "7"
2140 IF C$="0001101" THEN PRINT "8";
2150 IF C$="1001100" THEN PRINT "9";
2151 IF C$="0101100" THEN PRINT «{1AH}»;
2152 IF C$*"1101101" THEN PRINT «{1BH}»;
2153 IF C$="0011100" THEN PRINT «{1CH}»;
2154 IF C$="1011101" THEN PRINT «{1DH}»;
2155 IF C$="0111101" THEN PRINT «{1EH}»;
2160 IF C$="1000011" THEN PRINT "A";
2161 IF C$="0100011" THEN PRINT "В";
2162 IF C$="1100010" THEN PRINT "C";
2163 IF C$="0010011" THEN PRINT "D";
2164 IF C$="1010010" THEN PRINT "E";
2165 IF C$="0110010" THEN PRINT "F";
2166 IF C$="1110011" THEN PRINT "G";
2167 IF C$="0001011" THEN PRINT "H";
2168 IF C$="1001010" THEN PRINT "I";
2169 IF C$="0101010" THEN PRINT "J";
2170 IF C$="1101011" THEN PRINT "K";
2171 IF C$="0011010" THEN PRINT "L";
2172 IF C$="1011011" THEN PRINT "M";
2173 IF С$="0111011" THEN PRINT "N";
2174 IF C$="1111010' THEN PRINT "O";
2175 IF C$="0000111” THEN PRINT "P";
2176 IF C$="1000110" THEN PRINT "Q";
2177 IF C$="0100110" THEN PRINT "R";
2178 IF C$="1100111" THEN PRINT "S";
2179 IF C$="0010110" THEN PRINT "T";
2180 IF C$="1010111" THEN PRINT "U";
2181 IF C$="0110111" THEN PRINT "V";
2182 IF C$="1110110" THEN PRINT "W;
2183 IF C$="0001110" THEN PRINT "X";
2184 IF C$="1001111" THEN PRINT "Y";
2185 IF C$="0101111" THEN PRINT "Z";
2190 IF C$="1101110" THEN PRINT "{3BH);
2191 IF C$="0011111" THEN PRINT "{3DH);
2192 IF C$="1011110" THEN PRINT "{3EH);
2193 IF C$="1111111" THEN PRINT "{40H};
2999 RETURN
3000 REM (c) 1996 Patrick GUEULLE
LECTISO1.BAS – основная программа, которая посредством вызова
LECT210.EXE выполняет следующие операции:
• считывает 630 бит с дорожки ISO 1 и создает файл CARTE.CAR;
• отображает считанные 630 бит;
• отображает соответствующие алфавитно-цифровые символы.
Ниже представлен результат работы программы для частного случая файла TEST7.CAR, содержащегося на сайте www.dmk.ru (мы намеренно убрали несколько нулей заполнения).
Считывание дорожки ISO 3
Как и ISO 1, дорожка ISO 3 имеет плотность записи 210 bpi, но она содержит цифровые данные, которые закодированы пятиразрядным кодом.
Считывание производится при помощи программы LECT210.EXE, но считанные 630 бит на этот раз соответствуют 126 группам по 5 бит. На самом деле в записи может содержаться 107 цифр плюс 95 нулей заполнения.
Для запуска считывающей программы и декодирования требуется основная программа, которая по аналогии с LECTISO1 и LECTISO2 получила название LECTISO3.BAS.
10 REM – LECTIS03. BAS —
20 KEY OFF: CLS: PRINT: PRINT: PRINT: PRINT: PRINT: PRINT: PRINT: PRINT: PRINT
30 SHELL «LECT210.EXE»
40 OPEN «carte.car» FOR INPUT AS #I
50 DIM T(630)
60 FOR F=1 TO 630
70 INPUT #1,T(F)
80 NEXT F
90 J=1
100 IF T(J)<>1 THEN 160
110 IF T(J+1)<>1 THEN 160
120 IF T(J+2)<>0 THEN 160
130 IF T(J+3)<>1 THEN 160
140 IF T(J+4)<>0 THEN 160
150 K=J: GOTO 200
160 J=J+1: GOTO 100
200 C$=""
210 FOR F=0 TO 4
220 IF T(K+F)=0 THEN C$=C$ +"0"
230 IF T(K+F) =1 THEN C$=C$+"1"
240 NEXT F
250 GOSUB 2000
260 K=K+5: IF K>623 THEN END
270 GOTO 200
2000 IF C$="11010" THEN PRINT «{start}»
2010 IF C$="10110" THEN PRINT «{sep}»
2020 IF C$="11111" THEN PRINT «{end}»
2030 IF C$="01011" THEN PRINT «{10}»;
2040 IF C$="00111" THEN PRINT «{12}»;
2050 IF C$="01110" THEN PRINT «{14}»;
2060 IF C$="00001" THEN PRINT "0";
2070 IF C$="10000" THEN PRINT "1";
2080 IF C$="01000" THEN PRINT "2";
2090 IF C$="11001" THEN PRINT "3";
2100 IF C$="00100" THEN PRINT "4";
2110 IF C$="10101" THEN PRINT "5";
2120 IF C$="01101" THEN PRINT "6";
2130 IF C$="11100" THEN PRINT "7";
2140 IF C$="00010" THEN PRINT "8";
2150 IF C$="10011" THEN PRINT "9";
2999 RETURN
3000 REM (c)1996 Patrick GUEULLE
Эта программа абсолютно идентична LECTISO2, но она дает несколько более громоздкие результаты.
ПРОГРАММЫ ПРЕОБРАЗОВАНИЯ
Файлы с расширением .CAR, полученные с помощью LECT75 и LECT210, естественно, не вызывают никаких проблем совместимости с программами данной книги. Однако это не всегда получается при их использовании в другом контексте, что, конечно, вправе сделать любой из наших читателей.
Ниже приводятся несколько весьма полезных служебных программ для решения небольших проблем, которые рано или поздно могут появиться.
Программа выравнивания
Как уже показывалось, наши программы считывания магнитных дорожек создают линейные – однострочные, то есть без специальных символов перехода на новую строку, – файлы с расширением .CAR. Это нисколько не мешает их отображению, например с помощью команды ТУРЕ операционной системы DOS, но может возникнуть желание их распечатать или сохранить в более удобном формате.
Для этого вместо программы текстового редактора более практично, по нашему мнению, использовать небольшую программу JUSTCAR.ВAS, трансформирующую любой файл .CAR в строго упорядоченный блок из 32 колонок.
10 REM – JUSTCAR. BAS —
20 KEY OFF: CLS
30 PRINT «имя файла?»;
40 INPUT N$: IF N$="" THEN END
50 FOR F=1 TO LEN(N$)
60 IF MID$(N$,F,1) = "." THEN 90
70 NEXT F
80 N$=N$+".CAR"
90 OPEN NS: FOR INPUT AS #1
100 OPEN «carte.bak» FOR OUTPUT AS #2
110 DIM M(LOF(1)): CLS
120 L=0: WHILE NOT EOF(1)
130 INPUT#1,M(L)
140 PRINT#2,M(L);: L=L+1
150 WEND
160 CLOSE #1
170 OPEN NS FOR OUTPUT AS #1
180 G=0: FOR F=0 TO L-1
190 PRINT M(F);
200 IF M(F)=1 THEN PRINT#1,"1";
210 IF M(F)=0 THEN PRINT#1,"0";
220 G=G+1: IF G=32 THEN PRINT#1, G=0
230 NEXT F: PRINT
240 END
250 REM COPYRIGHT (c) 1996 Patrick GUEULLE
Отметим, что аварийный файл CARTE.ВАК был создан прежде всего для сохранения данных в случае сбоя, происшедшего во время обработки (разрыв сети и т. д.).
Кроме того, если имя исходного файла содержит расширение .CAR, у нас не будет необходимости его набирать, поскольку оно добавится автоматически.
В результате работы программы преобразованные данные заменяют содержимое исходного файла, при этом новый файл, хотя уже и выровненный, остается совместимым с программами данной книги.
Ниже показано, что получается при обработке файла TEST5.CAR с помощью программы JUSTCAR.
Программа инвертирования
Большинство считывающих устройств, начиная с описанных в данной главе, ожидают прохода карты в строго определенном направлении – как правило, это слева направо перед головкой. Иногда приходится проводить карту в обратном направлении (справа налево) или работать с нестандартными картами, записанными наоборот.
Программа INVERT.BAS способна «перевернуть» любой файл .CAR вне зависимости от его длины.
10 REM – INVERT.BAS —
20 KEY OFF: CLS
30 PRINT «имя файла, который следует перевернуть?»
40 INPUT N$: IF N$="" THEN END
50 FOR F=1 TO LEN(NS)
60 IF MID$ (N$,F,1)="." THEN 90
70 NEXT F
80 N$=N$+".CAR"
90 OPEN N$ FOR INPUT AS #1
100 OPEN «carte.bak» FOR OUTPUT AS #2
110 DIM M(LOF(1)): CLS
120 L=0: WHILE NOT EOF (1)
130 INPUT #1,M(L)
140 PRINT#2,M(L);: L=L+1
150 WEND
160 CLOSE #1
170 OPEN N$ FOR OUTPUT AS #1
180 FOR F=L-1 TO 0 STEP -1
190 PRINT M(F);
200 IF M(F)=1 THEN PRINT#1,"1";
210 IF M(F)=0 THEN PRINT#1,"0";
220 NEXT F: PRINT
230 END
240 REM COPYRIGHT (c)1997 Patrick GUEULLE
Ниже представлен результат, полученный с помощью файла-образца TEST5.CAR.
Программа преобразования в формат .CRD
Автор этой книги, естественно, не единственный в мире любитель магнитных карт, тем более что этот «вид спорта» особенно популярен в США. За океаном предпочтение отдают файлам формата .CRD,который отличается от .CAR отсутствием пробелов.
Поскольку в Internet можно встретить интересные программы, использующие формат .CRD, нам показалось полезным снабдить читателей служебной программой, способной сделать файлы .CAR совместимыми с ними. Речь идет о программе CARTOCRD.BAS.
В том виде, в котором она написана, эта небольшая программа может преобразовать файл CARTE.CAR, который был только что считан, в файл CARTE. CRD.
10 REM – CARTOCRD.BAS —
20 CLS: KEY OFF
30 PRINT «Преобразование файла CARTE.CAR в CARTE.CRD»
40 OPEN «carte.car» FOR INPUT AS #1
50 OPEN «carte.crd» FOR OUTPUT AS #2
60 IF EOF(1) THEN 110
70 INPUT #1,A
80 IF A=1 THEN PRINT#2,"1";
90 IF A=0 THEN PRINT#2,"0";
100 GOTO 60
110 PRINT «Выполнено»: BEEP
120 END
130 REM (c) 1996 Patrick GUEULLE
Ниже показано, во что превращается файл TEST5.CAR, обработанный программой CARTOCRD.BAS (сначала его надо скопировать под именем CARTE .CAR).
Программа импорта файлов
Служебная программа CRDTOCAR.BAS осуществляет обратную операцию по отношению к предыдущей. Иначе говоря, выполняет преобразование файла CARTE.CRD в CARTE.CAR, совместимый со всеми нашими остальными программами.
10 REM – CRDTOCAR.BAS —
20 CLS: KEY OFF
30 PRINT «Преобразование файла CARTE.CRD в CARTE.CAR»
40 OPEN «carte.crd» FOR INPUT AS #1
50 OPEN «carte.car» FOR OUTPUT AS #2
60 IF EOF (1) THEN 110
70 A$=INPUT$ (1,#1)
80 IF A$="1" THEN PRINT#2,"1";: GOT0 60
90 IF A$="0" THEN PRINT#2,"0";: GOTO 60
10 °CLS: BEEP: PRINT «CARTE.CRD не соответствует формату CRD»: END
110 PRINT «Выполнено»: BEEP
120 END
130 REM (c) 1997 Patrick GUEULLE
Этим можно воспользоваться, чтобы извлечь пользу из файлов. CRD, полученных от пользователей, работающих, например, с программой CARDOMAT, очень высоко ценимой в США, которая, надо признаться, несколько подстегнула воображение автора…
Рекомендуется сначала скопировать исходный файл под именем CARTE.CRD, в то время как результат преобразования будет носить имя CARTE.CAR.
ДЕКОДИРОВАНИЕ ПЯТИБИТНЫХ СИМВОЛОВ
Иногда необходимо декодировать содержимое файла .CAR, когда нет карты, с которой он был считан. Это может быть файл, уже прочитанный при помощи LECT75 или LECT210, или файл, переписанный на дискету либо полученный по электронной почте другим любителем считывания с магнитных карт. Это может быть даже файл, предварительно «перевернутый» программой INVERT, если есть подозрение, что он был считан в обратном направлении.
Наши программы LECTISO не подходят для решения такой задачи по двум основным причинам. Во-первых, они созданы специально для управления операцией считывания в оболочке, а не для работы в автономном режиме. Во-вторых, каждая из них разработана для строго определенной дорожки ISO, а значит, рассчитана на определенное число битов.
Программа DEC5.BAS, со своей стороны, может взаимодействовать с любым файлом .CAR с пятиразрядным кодированием (а значит, цифровым) вне зависимости от его длины и дорожки, с которой он взят.
Познакомиться с работой DECS.BAS можно, предложив ей декодировать файл TEST5 .CAR, который есть на сайте www.dmk.ru.
10 REM – DEC5.BAS —
20 KEY OFF: CLS
30 PRINT «Имя декодируемого файла?»;
40 INPUT N$: IF N$="" THEN END
50 FOR F=1 TO LEN(N$)
60 IF MID$(N$,F,1)="." THEN 90
70 NEXT F
80 N$=N$ +".CAR"
90 OPEN N$ FOR INPUT AS #1
100 L=INT(LOF(1)/2)-1
110 DIM T(LOF (1))
120 F=1:WHILE NOT EOF(1)
130 INPUT#1,T(F): F=F+1
140 WEND
150 J=1
160 IF T(J)<>1 THEN 220
170 IF T(J+1)<>1 THEN 220
180 IF T(J+2)<>0 THEN 220
190 IF T(J+3)<>1 THEN 220
200 IF T(J+4)<>0 THEN 220
210 K=J: GOTO 230
220 J=J+1: GOTO 160
230 C$=""
240 FOR F=0 TO 4
2S0 IF T(K+F) =0 THEN C$=C$+"0"
260 IF T(K+F) =1 THEN C$=C$+"1"
270 NEXT F
280 GOSUB 310
290 K=K+5: IF K>L-1 THEN END
300 GOTO 230
310 IF C$ = «11010» THEN PRINT «{Start}»
320 IF C$ = «10110» THEN PRINT « {sep}»
330 IF C$ = «11111» THEN PRINT «{end}»
340 IF C$ = «01011» THEN PRINT «{10}»;
350 IF C$ = «00111» THEN PRINT «{12}»;
360 IF C$ = «01110» THEN PRINT «{14}»;
370 IF C$ = «00001» THEN PRINT "0";
380 IF C$ = «10000» THEN PRINT "1";
390 IF С$ = «01000» THEN PRINT "2";
400 IF C$ = «11001» THEN PRINT "3";
410 IF C$ = «00100» THEN PRINT "4";
420 IF C$ = «10101» THEN PRINT "5";
430 IF C$ = «01101» THEN PRINT "6";
440 IF C$ = «11100» THEN PRINT -7";
450 IF C$ = «00010» THEN PRINT "8";
460 IF C$ = «10011» THEN PRINT "9";
470 RETURN
480 REM (с) 1996 Patrick GUEULLE
ДЕКОДИРОВАНИЕ СЕМИБИТНЫХ СИМВОЛОВ
Программа DEC7.BAS выполняет функцию, аналогичную выполняемой программой DEC5, но с алфавитно-цифровыми файлами, символы которых закодированы семью битами.
10 REM – DEC7.BAS —
20 KEY OFF: CLS
30 PRINT «Имя декодируемого файла?»;
40 INPUT N$: IF N$="" THEN END
50 FOR F=1 TO LEN(N$)
60 IF MID$ (N$,F,1) = "." THEN 90
70 NEXT F
80 N$=N$+".CAR"
90 OPEN N$ FOR INPUT AS #1
100 L=INT(LOF(1)/2)-1
110 DIM T (LOF (1))
120 F=1: WHILE NOT EOF(1)
130 INPUT#1,T(F): F=F+1
140 WEND
150 J=1
160 IF T(J)<>1 THEN 240
170 IF T(J+1)<>0 THEN 240
180 IF T(J+2)<>1 THEN 240
190 IF T(J+3)<>0 THEN 240
200 IF T(J+4)<>0 THEN 240
210 IF T(J+5)<>0 THEN 240
220 IF T(J+6)<>1 THEN 240
230 K=J: GOTO 250
240 J=J+1: GOTO 160
250 C$=""
260 FOR F=0 TO 6
270 IF T(K+F)=0 THEN C$=C$+"0"
280 IF T(K+F)=1 THEN C$=C$+"1"
290 NEXT F
300 GOSUB 330
310 K=K+7: IF K>L-1 THEN END
320 GOTO 250
330 IF C$="1010001" THEN PRINT «{start}»
340 IF C$="0111110" THEN PRINT «{sep}»
350 IF C$="1111100" THEN PRINT «{end}»
360 IF C$="0000001" THEN PRINT " ";
370 IF C$="1000000" THEN PRINT «{1H}»;
380 IF C$="0100000" THEN PRINT «{2H}»;
390 IF C$="1100001" THEN PRINT «{3H}»;
400 IF C$="0010000" THEN PRINT «{4H}»;
410 IF C$="0110001" THEN PRINT «{6H}»;
420 IF C$="1110000" THEN PRINT «{7H}»;
430 IF C$="0001000" THEN PRINT «{8H}»;
440 IF C$="1001001" THEN PRINT «{9H}»;
450 IF C$="0101001" THEN PRINT «{AH}»;
460 IF C$="1101000" THEN PRINT «{BH}»;
470 IF C$="0011001" THEN PRINT «{CH}»;
480 IF C$="1011000" THEN PRINT «{DH}»;
490 IF C$="0111000" THEN PRINT «{EH}»;
500 IF C$="1111001" THEN PRINT «{FH}»;
510 IF C$="0000100" THEN PRINT "0";
520 IF C$="1000101" THEN PRINT "1";
530 IF C$="0100101" THEN PRINT "2";
540 IF C$="1100100" THEN PRINT "3";
550 IF C$="0010101" THEN PRINT "4";
560 IF C$="1010100" THEN PRINT "5";
570 IF C$="0110100" THEN PRINT "6";
580 IF C$="1110101" THEN PRINT "7";
590 IF C$="0001101" THEN PRINT "8";
600 IF C$="1001100" THEN PRINT "9";
610 IF C$="0101100“ THEN PRINT «{1AH}»;
620 IF C$="1101101" THEN PRINT «{1BH}»;
630 IF C$="0011100" THEN PRINT «{1CH}»;
640 IF C$="1011101" THEN PRINT «{1DH}»;
650 IF C$="0111101" THEN PRINT «{1EH}»;
660 IF С$="1000011" THEN PRINT "A";
670 IF C$="0100011" THEN PRINT "В";
680 IF C$="1100010" THEN PRINT "C";
690 IF C$="0010011" THEN PRINT "D";
700 IF С$="1010010" THEN PRINT "E";
710 IF C$="0110010" THEN PRINT "F";
720 IF C$="1110011" THEN PRINT "G";
730 IF C$="0001011" THEN PRINT "H";
740 IF C$="1001010" THEN PRINT "I";
750 IF C$="0101010" THEN PRINT "J";
760 IF C$="1101011" THEN PRINT "K";
770 IF C$="0011010" THEN PRINT "L";
780 IF C$="1011011" THEN PRINT "M";
790 IF C$="0111011" THEN PRINT "N";
800 IF C$="1111010" THEN PRINT "O";
810 IF C$="0000111" THEN PRINT "P";
820 IF C$="1000110" THEN PRINT "Q";
830 IF C$="0100110" THEN PRINT "R";
840 IF C$="1100111" THEN PRINT "S";
850 IF C$="0010110" THEN PRINT "T";
860 IF C$="1010111" THEN PRINT "U";
870 IF C$="0110111" THEN PRINT "V";
880 IF C$="1110110" THEN PRINT "W";
890 IF C$="0001110' THEN PRINT "X";
900 IF C$="1001111" THEN PRINT "Y";
910 IF C$="0101111" THEN PRINT "Z";
920 IF C$="1101110'' THEN PRINT «{3BH}»;
930 IF C$="0011111" THEN PRINT «{3DH}»;
940 IF C$="1011110" THEN PRINT «{3EH}»
950 IF C$="1111111" THEN PRINT «{40H}»;
960 RETURN
970 REM (c) 1996 Patrick GUEULLE
КОНТРОЛЬ ЧЕТНОСТИ
Время от времени приходится сталкиваться с файлом .CAR, который после считывания карты не мог быть декодирован надлежащим образом с помощью программ LECTISO.
Прежде чем приступить к изучению карты с использованием «магнитного разоблачителя», желательно провести простой анализ посредством специальной программы.
10 REM – PARITY.BAS—
20 KEY OFF: CLS
30 PRINT «имя файла, подлежащего проверке»;
40 INPUT N$: IF N$ = "" THEN END
50 FOR F=1 TO LEN (N$)
60 IF MID$(N$,F,1) = "." THEN 90
70 NEXT F
80 N$=N$+".CAR"
90 OPEN N$ FOR INPUT AS #1
100 CLS: PRINT «идет контроль четности…»: PRINT
110 DIM A(LOF(1))
120 M=0: WHILE NOT EOF(1)
130 INPUT#1,A(M): M=M+1: WEND
140 PRINT «0…0»;
150 X=0
160 IF A(X) =1 THEN 180
170 X=X+1: GOTO 160
180 N=0: FOR F=X TO X+4
190 IF A(F) =1 THEN N=N+1: PRINT "1"; ELSE PRINT "0";
200 NEXT F: PRINT " ";
210 IF (N/2)-INT(N/2)=0 THEN 230
220 IF X>=M THEN 310 ELSE X=X+5: GOTO 180
230 IF N>0 THEN 290
240 FOR G=X TO M
250 IF A(G)>0 THEN 290
260 NEXT G
270 PRINT «0…0»
280 GOTO 310
290 PRINT: PRINT: PRINT: PRINT «четность 5-разрядного кода неправильная»
300 ВЕЕР: PRINT: PRINT: PRINT: GOTO 330
310 PRINT: PRINT: PRINT: PRINT «четность 5-разрядного кода правильная»
320 PRINT: PRINT: PRINT
330 PRINT"0…..0";
340 X=0
350 IF A(X)=1 THEN 370
360 X=X+1: GOTO 350
370 N=0: FOR F=X TO X+6
380 IF A(F) =1 THEN N=N+1: PRINT"!";ELSE PRINT "0";
390 NEXT F: PRINT " ";
400 IF (N/2)-INT(N/2)=0 THEN 420
410 IF X>=M THEN 500 ELSE X=X+7: GOTO 370
420 IF N>0 THEN 480
430 FOR G=X TO M
440 IF A(G) >0 THEN 480
Начиная с первого бита в 1, программа PARITY.BAS применяет определенные правила для проверки четности блоков данных по пять бит, затем по семь бит. При отсутствии ошибки это позволяет ей четко отличать файлы, закодированные пятиразрядным кодом ANSI, от закодированных семиразрядным кодом ANSI. Пока ошибка не обнаружена, программа выдает группы, успешно прошедшие проверку, и останавливается на первом символе с ошибкой, иначе говоря, на первой группе по пять или семь бит, содержащей четное число единиц.
Конечно, если проверки по пять бит и по семь бит окончились неудачей еще до конца файла, нельзя сразу сделать вывод. Необходим более тщательный анализ. Начать, если это возможно, следует с нового считывания карты.
В общем, эта программа позволит убедиться в отсутствии ошибки четности в любом файле .CAR.
Ниже представлен результат проверки файла TEST5.CAR (его можно найти на сайте www.dmk.ru) закодированного пятиразрядным кодом и не имеющего никаких ошибок четности. Следует обратить внимание, что нули запуска и заполнения представлены в сокращенной форме.
Теперь покажем результат той же самой проверки, на этот раз проведенной с файлом TEST7.CAR, закодированным семиразрядным кодом и также не имеющим никаких ошибок.
Мы не написали программу, предназначенную для проверки на этой стадии считывания символов LRC, которые обычно заканчивают каждую дорожку. Наша цель на данный момент заключается в обнаружении самых грубых ошибок, которые могли бы нарушить процесс считывания.
При возникновении настоятельной необходимости в проверке LRC можно обратиться к программе LRCMAG.BAS из главы 4. Эта программа предназначена для использования в ходе операций кодирования, но вполне годится и после считывания, за которым следует декодирование.
ПРОВЕРКА КОНТРОЛЬНОГО КЛЮЧА
Вот еще одна проверка, которую удобно проводить с файлом .CAR, но только после его декодирования. Речь идет не о серии битов, а о числе, состоящем из некоторого количества цифр помимо битов заполнения.