----- Пакет CRC32, версия 2 -----
----- Вычисление контрольного кода CRC-32 -----
----- Турбо Паскаль 6.0, Ассемблер -----
Торговые марки:
- PKZIP принадлежит PKWARE, Inc.;
- ARJ принадлежит Роберту К. Янгу (Robert K Jung).;
- Turbo PASCAL и Turbo Assembler принадлежат Borland Internatio-
nal, Inc.;
- Turbo Professional принадлежит TurboPower Software.
CRC32 распространяется по принципу SOURCEWARE - свободно с
исходным текстом. Он может быть свободно использован кем угодно
для некоммерческих целей. Его можно распространять, сохраняя имя
автора и не внося никаких изменений.
CRC32 распространяется AS-IS, то есть, автор отвергает всякую
ответственность и весь возможный риск ложится на пользователя.
Copyright (C) 1991, А.Е. Колесников.
CRC32 состоит из следующих компонент:
Имя файла Размер Дата Время CRC-32 Примечание
------------------------------------------------------------------
README.1ST 818 22/05/92 16:00:00 824ccfd3
CRC32.ASM 2301 28/12/91 19:00:00 020520f1 Для TASM 2.0
CRC32.DOC 5024 22/05/92 16:00:00 ???????? Этот документ
CRCDIR.EXE 31296 28/12/91 19:00:00 f8b3583d После TP 6.0
CRCTEST.EXE 17072 28/12/91 19:00:00 ba25b170 После TP 6.0
CRC32.OBJ 343 28/12/91 19:00:00 aa6a19b7 После TASM 2.0
CRC32.PAS 3300 28/12/91 19:00:00 02e41cfc Для TP 6.0
CRCDIR.PAS 10173 28/12/91 19:00:00 a601852c Печать оглавлений
CRCTEST.PAS 385 28/12/91 19:00:00 4111c388 Простой пример
CRC32.TPU 1568 28/12/91 19:00:00 82ea9dec После TP 6.0
TPCRT.TPU 26880 04/01/90 05:09:00 0d0d92cc \ Из Turbo Profes-
TPDOS.TPU 12448 04/01/90 05:09:00 3b97da9b | sional 5.09 для
TPHEAP6.TPU 432 04/01/90 05:09:00 1ad325dd | CRCDIR.PAS
TPINLINE.TPU 1792 04/01/90 05:09:00 7ae6f42d | (доработка
TPSTRING.TPU 14608 04/01/90 05:09:00 ed9673d9 / к Паскалю 6.0)
------------
Всего 15 файлов
------------------------------------------------------------------
!!! Примечание составителя:
Бинарные файлы и модули из библиотеки Turbo Professional 5.09
НЕ ВКЛЮЧЕНЫ по понятным причинам
------------------------------------------------------------------
Модуль CRC32.TPU вычисляет контрольный код CRC-32 для задан-
ной последовательности байтов. Это тот самый контрольный код, ко-
торый используется архиваторами PKZIP фирмы PKWARE, Inc., и ARJ
Роберта К. Янга. Известно, что CRC-32 вычисляется на неупакованном
файле.
Для вычисления CRC-32 заданной последовательности байтов надо
применить три процедуры. Первая - InitCRC - инициализирует CRC-32
значением $FFFFFFFF. Затем надо помещать порции заданной последо-
вательности в буфер и для каждой порции вызывать IncCRC. В конце
FinishCRC инвертирует все биты результата.
Две другие функции, CRCFileB и CRCFile, позволяют получить
CRC-32 заданного файла. Они возвращают целый результат - значение
IOResult, полученное в процессе чтения (порции) файла. Если ре-
зультат - 0, все в порядке; ненулевой результат означает ошибку
чтения.
Включены две демонстрационные программы - CRCTEST и CRCDIR.
Две основные программы реализованы на TASM 2.0, остальные на
Turbo PASCAL 6.0 с использованием Turbo Professional 5.09.
CRC-32 инициализируется значением $FFFFFFFF. Потом для каждо-
го байта B входной последовательности CRC-32 сдвигается вправо на
1 байт. Если байты CRC-32 были {C1,C2,C3,C4} (C1 - старший, C4 -
младший), сдвиг дает {0,C1,C2,C3}. Младший байт C4 побитно склады-
вается с B по модулю 2 (C4 xor B). Новым значением CRC-32 будет
его сдвинутое значение, сложенное побитно по модулю 2 (xor) с
4-байтовой величиной из "магической" таблицы с использованием
[B xor C4] в качестве индекса.
Было: CRC-32 = {C1,C2,C3,C4} и получили очередной байт B.
Стало:
CRC-32 = { 0,C1,C2,C3} xor Magic[B xor C4].
На Паскале:
CRC := (CRC shr 8) xor Magic[B xor byte(CRC and $FF)];
(здесь CRC - longint, Magic - array[byte] of longint).
Последний этап вычисления CRC-32 - инвертировать все биты:
CRC := not CRC;
Инициализация магической таблицы очень сложна и я воздержусь
от ее описания здесь. Почитайте CRC32.ASM.
Очевидное применение этих алгоритмов - проверка целостности
файлов.
Для контакта:
277028 Молдова, Кишинев,
ул. Академии 5,
Институт математики АН Молдовы,
Колесников Александр Евгеньевич
Тел.: (код 0422) 73-80-58, 72-59-82 (дирекция).
|