fork download
  1. program TestCRC;
  2.  
  3. {$MODE DELPHI}
  4.  
  5. uses SysUtils;
  6.  
  7. function Rol(Value: DWORD; Bits: Byte): DWORD;
  8. begin
  9. Rol := (Value shl Bits) or (Value shr (32 - Bits));
  10. end;
  11.  
  12. function CalculateCRC(Data: array of byte) : DWORD;
  13. var
  14. CRC : DWORD;
  15. DataSize,
  16. i : LongInt;
  17. begin
  18. CRC := 0;
  19. i := Low(Data);
  20. DataSize := High(Data) - Low(Data) + 1; // SizeOf(Data)
  21. if DataSize mod 2 = 1 then begin
  22. CRC := CRC xor DWord(Data[i]);
  23. Inc(i);
  24. end;
  25. while i < DataSize do begin
  26. CRC := Rol(CRC,5);
  27. CRC := CRC xor ((DWORD(Data[i]) shl 8) + DWORD(Data[i+1]));
  28. Inc(i, 2);
  29. end;
  30. CalculateCRC := CRC;
  31. End;
  32.  
  33. var
  34. Data: array of Byte;
  35. Count, Value, i: Integer;
  36.  
  37. begin
  38. ReadLn(Count);
  39. SetLength(Data, Count);
  40. for i := 0 to Count - 1 do begin
  41. Read(Value);
  42. Data[i] := Value;
  43. end;
  44.  
  45. WriteLn('CRC (dec): ', CalculateCRC(Data));
  46. WriteLn('CRC (hex): ', IntToHex(CalculateCRC(Data), 8));
  47. end.
Success #stdin #stdout 0s 5312KB
stdin
6
151 152 153 154 155 156
stdout
CRC (dec): 38652124
CRC (hex): 024DC8DC