![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
подсчёт CRC32 файла
Fanny © (2005-07-13 22:10:00)делал кто-нить сабж?
есть вариант с SysUtils, Classes, Dialogs? но уж больно много места занимает
Fanny (2005-07-15 20:48:00) [1]сделать-то сделал,
но почем-то разные значения получаются у одного и того же файла
ECM (2005-07-14 14:05:00) [2]Многие алгоритмы расчета CRC обычно требуют на входе поток байт
(по алгоритму бит...но это не так важно). Поэтому чтение файла
никак не относится (не должно относится!) к вычислению CRC...
ИМХО
ECM (2005-07-14 14:03:00) [3]Потоковое чтение файла в KOL вызывает проблемы...?
...переделывается за пять минут...:)
Fanny (2005-07-14 13:43:00) [4]2ECM
fmShareDenyNone
TFileStream
ECM (2005-07-14 11:07:00) [5]2Fanny
Интересно, а каким боком вычисление CRC32 может быть жестко привязано к SysUtils, Classes, Dialogs?
... :)
dmitry501 (2005-07-14 05:22:00) [6]
{ **** 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 могут потребоваться небольште переделки...