Как вычисляется контрольная сумма CRC32 с помощью FreePascal (Lazarus)? - PullRequest
0 голосов
/ 14 ноября 2018

Мне нужно сделать какой-нибудь проект для моего колледжа, и мне нужно рассчитать CRC32. Но раньше я почти не работал со сменами, поэтому даже после прочтения теории мне все еще трудно. Я нашел какой-то базовый алгоритм CRC32 для C (не мой) и попытался переписать его для 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 голосов
/ 15 ноября 2018

Обратите внимание, что FPC поставляется с блоком CRC32.(получено из crc32.c от Марка Адлера, выше)

Этот блок имеет функцию для вычисления CRC для блока с именем crc32 ()

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

XOR включен в этот crc32Функция .crc32 ().

0 голосов
/ 14 ноября 2018

0xCBF43926 - побитовое обратное («не») 0x340BC6D9. Вам просто нужно использовать not на результат, или эксклюзив или с $FFFFFFFF.

...