procedure GetCRC32File(FileName:string;var CRC32:DWORD);
function GetCrc32Str(s: string; Seed: LongInt):string;
implementation
procedure GetCRC32File(FileName:string;var CRC32:DWORD);
var
F:file;
BytesRead:DWORD;
Buffer:array[1..65521] of Byte;
i:Word;
begin
FileMode :=0;
CRC32 :=$ffffffff;
{$I-}
AssignFile(F,FileName);
Reset(F,1);
if IoResult = 0 then
begin
repeat
BlockRead(F,Buffer,Sizeof(Buffer),BytesRead);
for i := 1 to BytesRead do
CRC32 := (CRC32 shr 8) xor Table[Buffer[i] xor (CRC32 and $000000ff)];
until BytesRead = 0;
end;
CloseFile(F);
{$I+}
CRC32 := not CRC32;
end;
function GetCrc32Str(s: string; Seed: LongInt):string;
var
Count: Integer;
CrcVal: LongInt;
begin
CrcVal := Seed;
for Count := 1 to Length(s) do
CrcVal := Table[Byte(CrcVal xor DWORD(Ord(s[Count])))] xor ((CrcVal shr 8) and $00FFFFFF);
Result := IntToHex(not(CrcVal), 8);
end;
end.
调用:
uses Crc32;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text:=GetCrc32Str('11111111',8);//这里取指定字符串的CRC32校验值;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
FileStr:String;
crc: DWORD;
begin
FileStr:=Application.ExeName;//这里取指定的文件的crc32校验值;
GetCRC32File(FileStr,crc);
if crc<>0 then
Edit2.Text:=PChar(IntToHex(crc,6));
end;
function gettext(i:integer;BADDR:DWORD):byte;
begin
asm
Mov eax,BADDR
ADD EAX,I
MOV DL,BYTE PTR[EAX]
MOV @RESULT,DL
end;
end;
function CALCRC(ADDR,SIZE:DWORD):DWORD;
var
i,j: Integer;
databuf,tmp: String;
data, crc: DWord;
temp:byte;
begin
setlength(databuf,SIZE);
j:=0;
for i:=0 to SIZE do
begin
temp:=gettext(i,ADDR);
if temp<>0 then
begin
inc(j);
databuf[j]:=chr(temp);
end;
end;
setlength(databuf,j);
crc := 0;
for i:=1 to Length(databuf) do
begin
data := Ord(databuf[i]);
crc := QuickCRC32(data,crc);
end;
RESULT:=CRC;
end;
用法:以自校验
procedure GetCRC32File(FileName:string;var CRC32:DWORD);
var
F:file;
BytesRead:DWORD;
Buffer:array[1..65521] of Byte;
i:Word;
begin
FileMode :=0;
CRC32 :=$ffffffff;
{$I-}
AssignFile(F,FileName);
Reset(F,1);
if IoResult = 0 then
begin
repeat
BlockRead(F,Buffer,Sizeof(Buffer),BytesRead);
for i := 1 to BytesRead do
CRC32 := (CRC32 shr 8) xor Table[Buffer[i] xor (CRC32 and $000000ff)];
until BytesRead = 0;
end;
CloseFile(F);
{$I+}
CRC32 := not CRC32;
end;