我必须为我的大学做一些项目,我需要计算CRC32。但我之前几乎没有轮班工作,所以即使我读完理论,它仍然对我来说很难。我找到了一些用于C语言的CRC32 basic算法(不是我的),并尝试为拉撒路(Delphi)重写它。但它不起作用。我不明白,出什么事了。请帮助(*_ _)人
下面是我的代码:
procedure TMyFrame.CRC32_Checksum();
var
P : Pointer;
Size, i : Integer;
CRC, j : LongWord;
B : ^Byte;
flag : Boolean;
begin
AssignFile (f, FileName);
Reset(f, 1);
Size := FileSize(f);
GetMem(P, Size);
BlockRead(f, P^, Size);
B := P;
//
//
CRC := $FFFFFFFF;
for i := 1 to Size do
begin
CRC := CRC XOR B^;
Inc(B);
for j := 0 to 7 do
begin
flag := (CRC AND 1) > 0;
if flag then
CRC := (CRC SHR 1) XOR $04C11DB7
else
CRC := CRC SHR 1;
end;
end;
LabeledEdit1.Text := IntToHEX(CRC, 8);
//
//
Freemem(P);
CloseFile(f);
end;
发布于 2018-11-14 16:26:47
0xCBF43926
是0x340BC6D9
的逐位逆(“非”)。您只需对结果使用not
,或对$FFFFFFFF
使用exclusive或。
发布于 2018-11-15 10:32:12
请注意,FPC附带了一个CRC32单元。(来自上面Mark Adler的crc32.c )
这个单元有一个函数来计算一个名为crc32()的块的CRC。
function crc32 (crc : cardinal; buf : Pbyte; len : cardinal): cardinal;
XOR包含在这个crc32.crc32()函数中。
https://stackoverflow.com/questions/53302601
复制