⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lvkchecksumutils.pas

📁 单独打包出来
💻 PAS
字号:
{******************************************************************************}
{*                                                                            *}
{* (C) Copyright 1999-2002, Lasse V錱s鎡her Karlsen                           *}
{*                                                                            *}
{******************************************************************************}

{ Description:
    This unit contains CRC32 and MD5 checksum calculation functions.
}
unit lvkCheckSumUtils;

// $Author: Lasse V. Karlsen $
// $Revision: 6 $
// $Date: 16.04.03 10:50 $
// $Archive: /Components/LVK/source/lvkCheckSumUtils.pas $

interface

{$I VERSIONS.INC}
{$I DIRECTIVES.INC}

uses
  Classes, lvkSafeMem, lvkTypes, lvkCRC;

{ Description:
    These functions all generate the CRC32 checksum for a block of data, be it
    a file, a stream, or data in memory.
  Parameters:
    FileName  - The name of the file to generate the CRC32 checksum for.
    Stream    - The stream that holds the data to generate the CRC32 checksum
      for.
    Data      - A reference to the memory area where the data to generate the
      CRC32 checksum for is stored.
    Size      - The amount of bytes to process in the Data memory area.
    SafeMem   - The safemem data to generate the CRC32 checksum for.
  See also:
    CRC32Init, CRC32Process, CRC32Done
}
function CRC32Of(const FileName: string): TCRC32; overload;
// <COMBING CRC32Of@string>
function CRC32Of(const Stream: TStream): TCRC32; overload;
// <COMBING CRC32Of@string>
function CRC32Of(const Data; const Size: UInt32): TCRC32; overload;
// <COMBING CRC32Of@string>
function CRC32Of(const SafeMem: ISafeMem): TCRC32; overload;

type
  TMD5Signature = array[0..15] of Byte;

function MD5Of(const FileName: string): TMD5Signature; overload;
function MD5Of(const Stream: TStream): TMD5Signature; overload;
function MD5Of(const SafeMem: ISafeMem): TMD5Signature; overload;

function SignatureToString(const MD5Signature: TMD5Signature): string; overload;

implementation

uses
  SysUtils, lvkStreamFilters, lvkMD5ChecksumFilter;

function SignatureToString(const MD5Signature: TMD5Signature): string; overload;
var
  Index : Integer;
begin
  Result := '';
  for Index := Low(MD5Signature) to High(MD5Signature) do
    Result := Result + IntToHex(MD5Signature[Index], 2);
end;

function CRC32Of(const FileName: string): TCRC32; overload;
var
  Stream  : TStream;
begin
  Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    Result := CRC32Of(Stream);
  finally
    Stream.Free;
  end;
end;

function CRC32Of(const Stream: TStream): TCRC32; overload;
var
  Buffer    : PChar;
  InBuffer  : Integer;
begin
  CRC32Init(Result);
  Stream.Position := 0;
  GetMem(Buffer, 32768);
  try
    repeat
      InBuffer := Stream.Read(Buffer^, 32768);
      if InBuffer > 0 then
        CRC32Process(Result, Buffer^, InBuffer);
    until InBuffer = 0;
  finally
    FreeMem(Buffer);
  end;
  CRC32Done(Result);
end;

function CRC32Of(const Data; const Size: UInt32): TCRC32; overload;
begin
  CRC32Init(Result);
  CRC32Process(Result, Data, Size);
  CRC32Done(Result);
end;

function CRC32Of(const SafeMem: ISafeMem): TCRC32; overload;
begin
  Result := CRC32Of(SafeMem.Stream);
end;

function MD5Of(const FileName: string): TMD5Signature;
var
  Stream  : TStream;
begin
  Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    Result := MD5Of(Stream);
  finally
    Stream.Free;
  end;
end;

function MD5Of(const Stream: TStream): TMD5Signature;
var
  Buffer    : ISafeMem;
  Filter    : TlvkFilteredStream;
  MD5Filter : IStreamFilter;
  Index     : Integer;
begin
  Assert(Assigned(Stream));
  Stream.Position := 0;

  MD5Filter := NewMD5ChecksumFilter;
  Filter := TlvkFilteredStream.Create(Stream, False, [MD5Filter]);
  Buffer := AllocateSafeMem(32768);
  repeat
    Buffer.Grab(Filter);
  until Buffer.Size = 0;

  Assert((MD5Filter as IChecksumStreamFilter).ChecksumSize = SizeOf(Result));

  for Index := Low(Result) to High(Result) do
    Result[Index] := (MD5Filter as IChecksumStreamFilter).ChecksumBytes[Index];
end;

function MD5Of(const SafeMem: ISafeMem): TMD5Signature;
begin
  Result := MD5Of(SafeMem.Stream);
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -