Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.06;
Скачать: CL | DM;

Вниз

CRC32   Найти похожие ветки 

 
Artvz   (2005-02-16 07:35) [0]

Где можно найти алгоритм CRC32?
Дайте пожалуста ссылки!


 
Alex_Petr ©   (2005-02-16 07:45) [1]

Поиск по Мастакам с ключевым словом: CRC32  :)
http://www.delphimaster.ru/cgi-bin/search.pl?words=CRC32&n=0


 
WondeRu ©   (2005-02-16 09:47) [2]

{ **** 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;


 
Kerk ©   (2005-02-16 10:02) [3]

;---[ CUT HERE ]-------------------------------------------------------------
;
; Процедура получения CRC32
;  -------------------------
;
; на входе:
;        ESI = смещение, блока байтов, чей CRC32 должен быть вычислен
;        EDI = размер этого блока
; на выходе:
;        EAX = CRC32 данного блока
;

CRC32          proc
       cld
       xor     ecx,ecx                         ; Оптимизировано мно - на 2
       dec     ecx                             ; байта меньше
       mov     edx,ecx
NextByteCRC:
       xor     eax,eax
       xor     ebx,ebx
       lodsb
       xor     al,cl
       mov     cl,ch
       mov     ch,dl
       mov     dl,dh
       mov     dh,8
NextBitCRC:
       shr     bx,1
       rcr     ax,1
       jnc     NoCRC
       xor     ax,08320h
       xor     bx,0EDB8h
NoCRC: dec     dh
       jnz     NextBitCRC
       xor     ecx,eax
       xor     edx,ebx
       dec     edi                             ; на 1 байт меньше
       jnz     NextByteCRC
       not     edx
       not     ecx
       mov     eax,edx
       rol     eax,16
       mov     ax,cx
       ret
CRC32          endp
;---[ CUT HERE ]-------------------------------------------------------------

[C] Billy Belcebu



Страницы: 1 вся ветка

Текущий архив: 2005.03.06;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.052 c
6-1103882327
Lau
2004-12-24 12:58
2005.03.06
Зависание сокета при Send


8-1100605538
denis24
2004-11-16 14:45
2005.03.06
Информация о картинке отображаемой в image


14-1108452967
syte_ser78
2005-02-15 10:36
2005.03.06
заказ страниц на email


3-1107855864
Sava
2005-02-08 12:44
2005.03.06
Хранения изображений в БД


3-1107432598
denis24
2005-02-03 15:09
2005.03.06
из mdb в gdb