Форум: "Основная";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];
Внизподсчёт 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.037 c