Информационный сервер для программистов: Исходники со всего света. Паскальные исходники со всего света
  Powered by Поисковый сервер Яndex: Найдется ВСЁ!
На Главную Pascal Форум Информер Страны мира
   Контрольные Суммы    >>    crc-32
   
 
 Вычисление CRC-32  Александр Колесников 17.06.1994

Пакет CRC32 предназначен для вычисления 4-байтового контрольного кода любой последовательности байтов по алгоритму, применяемому, в частности, в архиваторах PKZIP и ARJ. Распространяется SOURCEWARE (свободно с исходным текстом). Написан на Ассемблере и Турбо Паскале 6.0. Поскольку основу пакета составляют ассемблерные модули и в документации дано словесное описание алгоритма, может применяться как пособие для разработки на других языках.



8k 
 

----- Пакет 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 (дирекция).