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

Вниз

подсчёт CRC32 файла   Найти похожие ветки 

 
Fanny   (2005-07-13 22:10) [0]

делал кто-нить сабж?
есть вариант с SysUtils, Classes, Dialogs? но уж больно много места занимает


 
dmitry501 ©   (2005-07-14 05:22) [1]

{ **** UBPFD *********** by delphibase.endimus.ru ****
>> Быстрый алгоритм подсчета 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.


Использую для рабочего проекта с VCL. Для KOL могут потребоваться небольште переделки...


 
ECM ©   (2005-07-14 11:07) [2]

2Fanny
Интересно, а каким боком вычисление CRC32 может быть жестко привязано к SysUtils, Classes, Dialogs?
... :)


 
Fanny   (2005-07-14 13:43) [3]

2ECM
fmShareDenyNone
TFileStream


 
ECM ©   (2005-07-14 14:03) [4]

Потоковое чтение файла в KOL вызывает проблемы...?
...переделывается за пять минут...:)


 
ECM ©   (2005-07-14 14:05) [5]

Многие алгоритмы расчета CRC обычно требуют на входе поток байт
(по алгоритму бит...но это не так важно). Поэтому чтение файла
никак не относится (не должно относится!) к вычислению CRC...
ИМХО


 
Fanny   (2005-07-15 20:48) [6]

сделать-то сделал,
но почем-то разные значения получаются у одного и того же файла



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

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

Наверх




Память: 0.48 MB
Время: 0.047 c
1-1121862001
Alex_Bredin
2005-07-20 16:20
2005.08.07
"Залипающая" кнопка


1-1121773434
msguns
2005-07-19 15:43
2005.08.07
События динамически создаваемых объектов


4-1118046120
Андрей Жук
2005-06-06 12:22
2005.08.07
Как перечислить потоки, которые привязаны к процессу?


14-1121290192
Alex_Korn
2005-07-14 01:29
2005.08.07
Черт !!! Застыл на одном месте !


14-1120783826
АНТИСПАММЕР
2005-07-08 04:50
2005.08.07
Карта Земли GoogleEarth