git-svn-id: https://svn.code.sf.net/p/kolmck/code@67 91bb2d04-0c0c-4d2d-88a5-bbb6f4c1fa07
81 lines
1.5 KiB
ObjectPascal
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.
|