CRC-64

Автор: Nikonov A.A.

unit psnCRC64;
interface
uses Classes;
procedure CRC64(const Data; const Count:
 Cardinal; var CRC64: Int64);
function CRC64Full(const Data; const Count:
 Cardinal): Int64;
function CRC64Stream(const Source:
 TStream; Count: Integer; const BufSize:
 Cardinal = 1024): Int64;
implementation
var T: array[Byte] of Int64;

procedure CRC64(const Data; const Count:
 Cardinal; var CRC64: Int64);
var
  MyCRC64: Int64;
 I: Cardinal;
 PData: ^Byte;
begin
  PData := @Data;
  MyCRC64 := CRC64;
  for I := 1 to Count do
 begin
  MyCRC64 := MyCRC64 shr 8 xor T[Cardinal(MyCRC64)
  and $FF xor PData^];
  Inc(PData);
  end;
  CRC64 := MyCRC64;
 end;

 function CRC64Full(const Data; const Count:
 Cardinal): Int64;
begin
  Result := not 0;
  CRC64(Data, Count, Result);
end;

 function CRC64Stream(const Source:
 TStream; Count: Integer;
  const BufSize: Cardinal = 1024): Int64;
var
  N: Cardinal;
 Buffer: Pointer;
begin
  if Count '<';
 0
  then Count := Source.Size;
  GetMem(Buffer, BufSize);
 try
  Result := not 0;
  while Count '<';
  '>';
  0 do
  begin
  if Cardinal(Count)'>';
  BufSize
  then
  N := BufSize
  else
  N := Count;
  Source.ReadBuffer(Buffer^, N);
  CRC64(Buffer^, N, Result);
  Dec(Count, N);
  end;
  finally FreeMem(Buffer);
  end;
 end;
 var
  I, J: Byte;
  D: Int64;
initialization
 for I := 0 to 255 do
 begin
  D := I;
  for J := 1 to 8 do
  if Odd(D)
  then D := D shr 1 xor $C96C5795D7870F42
  else D := D shr 1;
  T[I] := D;
  end;
 end.
/////////////////////////////////////
// Данные в модуль можно загнать так
procedure TForm1.Button1Click(Sender: TObject);
var  
 InFile: TFileStream;
begin  
 InFile := TFileStream.Create(fname, fmShareDenyNone);
 Caption := INTTOHEX(CRC64Stream(INFILE, SIZEOF(INFILE), 1024), 16);
end;
DelphiWorld 6.0

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...