Приведен модуль для Delphi 1.0 (для Delphi 2.0 должны быть сделаны небольшие изменения):
UNIT CRC32;
{CRC32 рассчитывает код циклической избыточности (cyclic redundancy code - CRC), известный как CRC-32, с использованием алгоритма byte-wise ("мудрый байт").
Данный модуль является производным от программы CRCT FORTRAN 77, опубликованной в "Byte-wise CRC Calculations" за авторством Aram Perez из IEEE Micro, Июнь 1983, страницы 40-50. Константы для полиномиального генератора CRC-32, приведенные здесь, опубликованы в "Microsoft Systems Journal", Март 1995, страницы 107-108.
Данный CRC алгоритм имеет бОльшую скорость за счет 512 элементов таблицы поиска.} INTERFACE
PROCEDURE CalcCRC32 (p: pointer; nbyte: WORD; VAR CRCvalue: LongInt); PROCEDURE CalcFileCRC32 (FromName: STRING; VAR CRCvalue: LongInt; VAR IOBuffer: pointer; BufferSize: WORD; VAR TotalBytes: LongInt; VAR error: WORD); IMPLEMENTATION
TYPE buffer = ARRAY[1..65521] OF BYTE; { самый большой буфер, который } { только можно распределить в Куче } VAR i: WORD; q: ^buffer;
PROCEDURE CalcCRC32 (p: pointer; nbyte: WORD; VAR CRCvalue: LongInt); {Ниже выполняется небольшое криптование (но выполняется очень быстро). Алгоритм работает следующим образом: 1. совершаем операцию "И/ИЛИ" (XOR) входного байта с младшей частью регистра CRC для получения INDEX 2. сдвигаем регистр CRC на восемь битов вправо 3. совершаем операцию "И/ИЛИ" (XOR) с CRC регистром и Table[INDEX] 4. повторяем шаги с 1 по 3 для всех байтов } BEGIN q := p; FOR i := 1 TO nBYTE DO CRCvalue := (CRCvalue SHR 8) XOR Table[ q^[i] XOR (CRCvalue AND $000000FF) ] END {CalcCRC32};
PROCEDURE CalcFileCRC32 (FromName: STRING; VAR CRCvalue: LongInt; VAR IOBuffer: pointer; BufferSize: WORD; VAR TotalBytes: LongInt; VAR error: WORD); VAR BytesRead: WORD; FromFile : FILE; i : WORD; BEGIN FileMode := 0; {Turbo по умолчанию 2 для R/W и 0 для R/O} CRCValue := $FFFFFFFF; ASSIGN (FromFile,FromName); {$I-} RESET (FromFile,1); {$I+} error := IOResult; IF error = 0 THEN BEGIN TotalBytes := 0; REPEAT BlockRead (FromFile,IOBuffer^,BufferSize,BytesRead); CalcCRC32 (IOBuffer,BytesRead,CRCvalue); INC (TotalBytes, BytesRead) UNTIL BytesRead = 0; CLOSE (FromFile) END; CRCvalue := NOT CRCvalue END {CalcFileCRC32}; END {CRC}.