kolmck/Addons/UCRC.pas
dkolmck 8a71ebf5bc addons update
git-svn-id: https://svn.code.sf.net/p/kolmck/code@67 91bb2d04-0c0c-4d2d-88a5-bbb6f4c1fa07
2010-10-04 12:58:59 +00:00

81 lines
1.5 KiB
ObjectPascal

unit UCRC;
{$IFDEF FPC}
{$MODE Delphi}
{$ENDIF}
interface
uses KOL;
type PCRC = ^TCRC;
TCRC = object(TObj)
public
Value:integer;
constructor Create;
procedure _Init;
procedure Update(const data: array of byte;const offset,size:integer);overload;
procedure Update(const data: array of byte);overload;
procedure UpdateByte(const b:integer);
function GetDigest:integer;
end;
implementation
var Table: array [0..255] of integer;
constructor TCRC.Create;
begin
Value:=-1;
end;
procedure TCRC._Init;
begin
Value:=-1;
end;
procedure TCRC.Update(const data: array of byte;const offset,size:integer);
var i:integer;
begin
for i := 0 to size-1 do
value := Table[(value xor data[offset + i]) and $FF] xor (value shr 8);
end;
procedure TCRC.Update(const data: array of byte);
var size:integer;
i:integer;
begin
size := length(data);
for i := 0 to size - 1 do
value := Table[(value xor data[i]) and $FF] xor (value shr 8);
end;
procedure TCRC.UpdateByte(const b:integer);
begin
value := Table[(value xor b) and $FF] xor (value shr 8);
end;
function TCRC.GetDigest:integer;
begin
result:=value xor (-1);
end;
procedure InitCRC;
var i,j,r:integer;
begin
for i := 0 to 255 do begin
r := i;
for j := 0 to 7 do begin
if ((r and 1) <> 0) then
r := (r shr 1) xor integer($EDB88320)
else r := r shr 1;
end;
Table[i] := r;
end;
end;
initialization
InitCRC;
end.