Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  4 042

•  TDictionary Custom Sort  6 152

•  Fast Watermark Sources  5 945

•  3D Designer  8 810

•  Sik Screen Capture  6 282

•  Patch Maker  6 697

•  Айболит (remote control)  6 693

•  ListBox Drag & Drop  5 546

•  Доска для игры Реверси  95 788

•  Графические эффекты  6 920

•  Рисование по маске  6 148

•  Перетаскивание изображений  5 077

•  Canvas Drawing  5 455

•  Рисование Луны  5 167

•  Поворот изображения  4 711

•  Рисование стержней  3 321

•  Paint on Shape  2 564

•  Генератор кроссвордов  3 456

•  Головоломка Paletto  2 763

•  Теорема Монжа об окружностях  3 565

•  Пазл Numbrix  2 336

•  Заборы и коммивояжеры  3 022

•  Игра HIP  1 979

•  Игра Go (Го)  1 901

•  Симулятор лифта  2 253

•  Программа укладки плитки  1 963

•  Генератор лабиринта  2 411

•  Проверка числового ввода  2 093

•  HEX View  2 421

•  Физический маятник  2 051

 
скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

Быстрый алгоритм подсчета CRC32



{ **** UBPFD *********** by delphibase.endimus.com ****
>> Быстрый алгоритм подсчета CRC32

Использован BASM.

Зависимости: нет
Автор:       Александр Шарахов, alsha@mailru.com, Москва
Copyright:   Александр Шарахов
Дата:        18 января 2003 г.
***************************************************** }

unit CRCunit;

interface
function GetNewCRC(OldCRC: cardinal; StPtr: pointer; StLen: integer): cardinal;
procedure UpdateCRC(StPtr: pointer; StLen: integer; var CRC: cardinal);
function GetZipCRC(StPtr: pointer; StLen: integer): cardinal;
function GetFileCRC(const FileName: string): cardinal;

implementation
var
  CRCtable: array[0..255] of cardinal;

function GetNewCRC(OldCRC: cardinal; StPtr: pointer; StLen: integer): cardinal;
asm
  test edx,edx;
  jz @ret;
  neg ecx;
  jz @ret;
  sub edx,ecx; // Address after last element

  push ebx;
  mov ebx,0; // Set ebx=0 & align @next
@next:
  mov bl,al;
  xor bl,byte [edx+ecx];
  shr eax,8;
  xor eax,cardinal [CRCtable+ebx*4];
  inc ecx;
  jnz @next;
  pop ebx;

@ret:
end;

procedure UpdateCRC(StPtr: pointer; StLen: integer; var CRC: cardinal);
begin
  CRC := GetNewCRC(CRC, StPtr, StLen);
end;

function GetZipCRC(StPtr: pointer; StLen: integer): cardinal;
begin
  Result := not GetNewCRC($FFFFFFFF, StPtr, StLen);
end;

function GetFileCRC(const FileName: string): cardinal;
const
  BufSize = 64 * 1024;
var
  Fi: file;
  pBuf: PChar;
  Count: integer;
begin
  Assign(Fi, FileName);
  Reset(Fi, 1);
  GetMem(pBuf, BufSize);
  Result := $FFFFFFFF;
  repeat
    BlockRead(Fi, pBuf^, BufSize, Count);
    if Count = 0 then
      break;
    Result := GetNewCRC(Result, pBuf, Count);
  until false;
  Result := not Result;
  FreeMem(pBuf);
  CloseFile(Fi);
end;

procedure CRCInit;
var
  c: cardinal;
  i, j: integer;
begin
  for i := 0 to 255 do
  begin
    c := i;
    for j := 1 to 8 do
      if odd(c) then
        c := (c shr 1) xor $EDB88320
      else
        c := (c shr 1);
    CRCtable[i] := c;
  end;
end;

initialization
  CRCinit;
end.

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

uses
  CRCunit;

procedure TForm1.Button1Click(Sender: TObject);
const
  FileName = 'CRCunit.pas';
begin
  ShowMessage('CRC32 файла=' + IntToHex(GetFileCRC(FileName), 8));
  ShowMessage('CRC32 имени=' + IntToHex(GetZipCRC(PChar(FileName),
    Length(FileName)), 8));
end;




Похожие по теме исходники

Генетический Алгоритм

Алгоритм Дейкстры

Алгоритм Беллмана-Форда




Copyright © 2004-2025 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте