FreePascal(Lazarus)如何计算CRC32校验和?

时间:2018-11-14 14:32:26

标签: lazarus crc32

我必须为我的大学做一些项目,并且我需要计算CRC32。但是以前我几乎没有工作,所以即使我读了理论,对我来说仍然很难。我找到了一些针对C的CRC32基本算法(不是我的),并尝试为Lazarus(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;                   

2 个答案:

答案 0 :(得分:3)

0xCBF439260x340BC6D9的按位倒数(“ not”)。您只需要在结果上使用not,或者对$FFFFFFFF进行排他或使用。

答案 1 :(得分:1)

请注意,FPC带有CRC32单元。 (摘自上面的Mark Adler的crc32.c)

此单元具有计算名为crc32()的块的CRC的功能

  function crc32 (crc : cardinal; buf : Pbyte; len : cardinal): cardinal;

此crc32.crc32()函数包含XOR。