Delphi World - Расчёт контрольной суммы файла CRC-32 (Доработано)
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Расчёт контрольной суммы файла CRC-32 (Доработано)

Автор: MegaVolt
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Расчёт контрольной суммы файла CRC-32

Функция находит контрольную сумму файла FileName
(полное имя файла с путём). Если возникает ошибка
(файл не найден или его нельзя открыть для чтения)
выдаётся сообщение об этом. Если это не нужно
то удалить строки с выводом сообщения.

Зависимости: classes, Sysutils, Dialogs;
Автор:       MegaVolt, MegaVoltik@yahoo.com
Copyright:   :( Не помню :( Взято где то в сети
несколько доработано и после обсуждения в
Дата:        3 декабря 2002 г.
***************************************************** }

unit Crc32;

interface

uses
  classes, Sysutils, Dialogs;

function FileCRC32(const FileName: string): Cardinal;
function UpdateCRC32(InitCRC: Cardinal; BufPtr: Pointer; Len: Word): LongInt;

implementation

type
  CRCTable = array[0..255] of Cardinal;

const
  BufLen = 32768;

  CRC32Table: CRCTable =
  ($00000000, $77073096, $EE0E612C, $990951BA,
    $076DC419, $706AF48F, $E963A535, $9E6495A3,
    $0EDB8832, $79DCB8A4, $E0D5E91E, $97D2D988,
    $09B64C2B, $7EB17CBD, $E7B82D07, $90BF1D91,

    $1DB71064, $6AB020F2, $F3B97148, $84BE41DE,
    $1ADAD47D, $6DDDE4EB, $F4D4B551, $83D385C7,
    $136C9856, $646BA8C0, $FD62F97A, $8A65C9EC,
    $14015C4F, $63066CD9, $FA0F3D63, $8D080DF5,

    $3B6E20C8, $4C69105E, $D56041E4, $A2677172,
    $3C03E4D1, $4B04D447, $D20D85FD, $A50AB56B,
    $35B5A8FA, $42B2986C, $DBBBC9D6, $ACBCF940,
    $32D86CE3, $45DF5C75, $DCD60DCF, $ABD13D59,

    $26D930AC, $51DE003A, $C8D75180, $BFD06116,
    $21B4F4B5, $56B3C423, $CFBA9599, $B8BDA50F,
    $2802B89E, $5F058808, $C60CD9B2, $B10BE924,
    $2F6F7C87, $58684C11, $C1611DAB, $B6662D3D,

    $76DC4190, $01DB7106, $98D220BC, $EFD5102A,
    $71B18589, $06B6B51F, $9FBFE4A5, $E8B8D433,
    $7807C9A2, $0F00F934, $9609A88E, $E10E9818,
    $7F6A0DBB, $086D3D2D, $91646C97, $E6635C01,

    $6B6B51F4, $1C6C6162, $856530D8, $F262004E,
    $6C0695ED, $1B01A57B, $8208F4C1, $F50FC457,
    $65B0D9C6, $12B7E950, $8BBEB8EA, $FCB9887C,
    $62DD1DDF, $15DA2D49, $8CD37CF3, $FBD44C65,

    $4DB26158, $3AB551CE, $A3BC0074, $D4BB30E2,
    $4ADFA541, $3DD895D7, $A4D1C46D, $D3D6F4FB,
    $4369E96A, $346ED9FC, $AD678846, $DA60B8D0,
    $44042D73, $33031DE5, $AA0A4C5F, $DD0D7CC9,

    $5005713C, $270241AA, $BE0B1010, $C90C2086,
    $5768B525, $206F85B3, $B966D409, $CE61E49F,
    $5EDEF90E, $29D9C998, $B0D09822, $C7D7A8B4,
    $59B33D17, $2EB40D81, $B7BD5C3B, $C0BA6CAD,

    $EDB88320, $9ABFB3B6, $03B6E20C, $74B1D29A,
    $EAD54739, $9DD277AF, $04DB2615, $73DC1683,
    $E3630B12, $94643B84, $0D6D6A3E, $7A6A5AA8,
    $E40ECF0B, $9309FF9D, $0A00AE27, $7D079EB1,

    $F00F9344, $8708A3D2, $1E01F268, $6906C2FE,
    $F762575D, $806567CB, $196C3671, $6E6B06E7,
    $FED41B76, $89D32BE0, $10DA7A5A, $67DD4ACC,
    $F9B9DF6F, $8EBEEFF9, $17B7BE43, $60B08ED5,

    $D6D6A3E8, $A1D1937E, $38D8C2C4, $04FDFF252,
    $D1BB67F1, $A6BC5767, $3FB506DD, $048B2364B,
    $D80D2BDA, $AF0A1B4C, $36034AF6, $041047A60,
    $DF60EFC3, $A867DF55, $316E8EEF, $04669BE79,

    $CB61B38C, $BC66831A, $256FD2A0, $5268E236,
    $CC0C7795, $BB0B4703, $220216B9, $5505262F,
    $C5BA3BBE, $B2BD0B28, $2BB45A92, $5CB36A04,
    $C2D7FFA7, $B5D0CF31, $2CD99E8B, $5BDEAE1D,

    $9B64C2B0, $EC63F226, $756AA39C, $026D930A,
    $9C0906A9, $EB0E363F, $72076785, $05005713,
    $95BF4A82, $E2B87A14, $7BB12BAE, $0CB61B38,
    $92D28E9B, $E5D5BE0D, $7CDCEFB7, $0BDBDF21,

    $86D3D2D4, $F1D4E242, $68DDB3F8, $1FDA836E,
    $81BE16CD, $F6B9265B, $6FB077E1, $18B74777,
    $88085AE6, $FF0F6A70, $66063BCA, $11010B5C,
    $8F659EFF, $F862AE69, $616BFFD3, $166CCF45,

    $A00AE278, $D70DD2EE, $4E048354, $3903B3C2,
    $A7672661, $D06016F7, $4969474D, $3E6E77DB,
    $AED16A4A, $D9D65ADC, $40DF0B66, $37D83BF0,
    $A9BCAE53, $DEBB9EC5, $47B2CF7F, $30B5FFE9,

    $BDBDF21C, $CABAC28A, $53B39330, $24B4A3A6,
    $BAD03605, $CDD70693, $54DE5729, $23D967BF,
    $B3667A2E, $C4614AB8, $5D681B02, $2A6F2B94,
    $B40BBE37, $C30C8EA1, $5A05DF1B, $2D02EF8D);

var
  Buf: array[1..BufLen] of Byte;

function UpdateCRC32(InitCRC: Cardinal; BufPtr: Pointer; Len: Word): LongInt;
var
  crc: Cardinal;
  index: Integer;
  i: Cardinal;
begin
  crc := InitCRC;
  for i := 0 to Len - 1 do
  begin
    index := (crc xor Cardinal(Pointer(Cardinal(BufPtr) + i)^)) and $000000FF;
    crc := (crc shr 8) xor CRC32Table[index];
  end;
  Result := crc;
end;

function FileCRC32(const FileName: string): Cardinal;
var
  InFile: TFileStream;
  crc32: Cardinal;
  Res: Integer;
  BufPtr: Pointer;
begin
  BufPtr := @Buf;
  crc32 := $FFFFFFFF;
  try
    InFile := TFileStream.Create(FileName, fmShareDenyNone);
    Res := InFile.Read(Buf, BufLen);
    while (Res <> 0) do
    begin
      crc32 := UpdateCrc32(crc32, BufPtr, Res);
      Res := InFile.Read(Buf, BufLen);
    end;
    InFile.Destroy;
  except
    on E: Exception do
    begin
      if Assigned(InFile) then
        InFile.Free;
      ShowMessage(Format('При обработке файла [%s] вышла ' +
        'вот такая oшибочка [%s]', [FileName, E.Message]));
    end;
  end;
  Result := not crc32;
end;

end.

Пример использования:

var
  i: cardinal;
begin
  i := FileCRC32('c:\autoexec.bat');
  ShowMessage('Контрольная сумма файла = ' IntToStr(i));
Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования