function crc(s: PChar; len: Integer): DWORD;
var
acc, i: DWORD;
begin
acc := 0;
while(len > 0) do
begin
acc := acc xor (Ord(s^) shl 8);
Inc(s);
for i := 0 to 7 do
begin
if Boolean(acc AND $8000) then
acc := (acc shl 1) xor $7301
else
acc := acc shl 1;
end;
Dec(len);
end;
Result := acc;
end;