Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.047 c
4-1102326344
Алим
2004-12-06 12:45
2005.03.06
Автоблокировка компьютера


14-1108028790
AlexG
2005-02-10 12:46
2005.03.06
Работать как частный предприниматель...


1-1108684776
jcrush
2005-02-18 02:59
2005.03.06
как загрузить тестовик из DLL


4-1106027709
Gero
2005-01-18 08:55
2005.03.06
Изменения пароля пользователя по сети


1-1108742803
сомневающийся
2005-02-18 19:06
2005.03.06
Hint на DBCtrlGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский