program TestCRC;
{$MODE DELPHI}
uses SysUtils;
function Rol(Value: DWORD; Bits: Byte): DWORD;
begin
Rol := (Value shl Bits) or (Value shr (32 - Bits));
end;
function CalculateCRC(Data: array of byte) : DWORD;
var
CRC : DWORD;
DataSize,
i : LongInt;
begin
CRC := 0;
i := Low(Data);
DataSize := High(Data) - Low(Data) + 1; // SizeOf(Data)
if DataSize mod 2 = 1 then begin
CRC := CRC xor DWord(Data[i]);
Inc(i);
end;
while i < DataSize do begin
CRC := Rol(CRC,5);
CRC := CRC xor ((DWORD(Data[i]) shl 8) + DWORD(Data[i+1]));
Inc(i, 2);
end;
CalculateCRC := CRC;
End;
var
Data: array of Byte;
Count, Value, i: Integer;
begin
ReadLn(Count);
SetLength(Data, Count);
for i := 0 to Count - 1 do begin
Read(Value);
Data[i] := Value;
end;
WriteLn('CRC (dec): ', CalculateCRC(Data));
WriteLn('CRC (hex): ', IntToHex(CalculateCRC(Data), 8));
end.
cHJvZ3JhbSBUZXN0Q1JDOwoKeyRNT0RFIERFTFBISX0KCnVzZXMgU3lzVXRpbHM7CgpmdW5jdGlvbiBSb2woVmFsdWU6IERXT1JEOyBCaXRzOiBCeXRlKTogRFdPUkQ7CmJlZ2luCiAgUm9sIDo9IChWYWx1ZSBzaGwgQml0cykgb3IgKFZhbHVlIHNociAoMzIgLSBCaXRzKSk7CmVuZDsKCmZ1bmN0aW9uIENhbGN1bGF0ZUNSQyhEYXRhOiBhcnJheSBvZiBieXRlKSA6IERXT1JEOwp2YXIKQ1JDIDogRFdPUkQ7CkRhdGFTaXplLAppIDogTG9uZ0ludDsKYmVnaW4KQ1JDIDo9IDA7CmkgOj0gTG93KERhdGEpOwpEYXRhU2l6ZSA6PSBIaWdoKERhdGEpIC0gTG93KERhdGEpICsgMTsgLy8gU2l6ZU9mKERhdGEpCmlmIERhdGFTaXplIG1vZCAyID0gMSB0aGVuIGJlZ2luCkNSQyA6PSBDUkMgeG9yIERXb3JkKERhdGFbaV0pOwpJbmMoaSk7CmVuZDsKd2hpbGUgaSA8IERhdGFTaXplIGRvIGJlZ2luCkNSQyA6PSBSb2woQ1JDLDUpOwpDUkMgOj0gQ1JDIHhvciAoKERXT1JEKERhdGFbaV0pIHNobCA4KSArIERXT1JEKERhdGFbaSsxXSkpOwpJbmMoaSwgMik7CmVuZDsKQ2FsY3VsYXRlQ1JDIDo9IENSQzsKRW5kOwoKdmFyCiAgRGF0YTogYXJyYXkgb2YgQnl0ZTsKICBDb3VudCwgVmFsdWUsIGk6IEludGVnZXI7CgpiZWdpbgogIFJlYWRMbihDb3VudCk7CiAgU2V0TGVuZ3RoKERhdGEsIENvdW50KTsKICBmb3IgaSA6PSAwIHRvIENvdW50IC0gMSBkbyBiZWdpbgogICAgUmVhZChWYWx1ZSk7CiAgICBEYXRhW2ldIDo9IFZhbHVlOwogIGVuZDsKCiAgV3JpdGVMbignQ1JDIChkZWMpOiAnLCBDYWxjdWxhdGVDUkMoRGF0YSkpOwogIFdyaXRlTG4oJ0NSQyAoaGV4KTogJywgSW50VG9IZXgoQ2FsY3VsYXRlQ1JDKERhdGEpLCA4KSk7CmVuZC4=