对文件、字符串进行 CRC 校验

{*------------------------------------------------
CRC 校验
@author xszlo
@version P72
@todo 1
@History,2010-7-16,1
--------------------------------------------------*}

unit uCRC;

interface

uses
Windows, SysUtils;

type
TCRC = class(TObject)
private
Table: array[0..255] of DWORD;
procedure MakeTable();
public
procedure GetCRC32File(FileName: string; var CRC32: DWORD);
function GetCrc32Str(s: string; Seed: LongInt): string;
function GetCRC32FileHexStr(FileName: string): string;
end;

implementation

{ TCRC }

{-------------------------------------------------------------------------------
过程名: TCRC.GetCRC32File
作者: xszlo
日期: 2008.12.09
参数: FileName: string; var CRC32: DWORD
返回值: 无
作用: 生成文件的CRC32验证码
-------------------------------------------------------------------------------}
procedure TCRC.GetCRC32File(FileName: string; var CRC32: DWORD);
var
F: file;
BytesRead: DWORD;
Buffer: array[1..65521] of Byte;
i: Word;
begin
MakeTable;
FileMode := 0;
CRC32 := $FFFFFFFF;
{$I-}
AssignFile(F, FileName);
Reset(F, 1);
if IoResult = 0 then
begin
repeat
BlockRead(F, Buffer, Sizeof(Buffer), BytesRead);
for i := 1 to BytesRead do
CRC32 := (CRC32 shr 8) xor Table[Buffer[i] xor (CRC32 and $000000FF)];
until BytesRead = 0;
end;
CloseFile(F);
{$I+}
CRC32 := not CRC32;
end;

{-------------------------------------------------------------------------------
过程名: TCRC.GetCRC32FileHexStr
作者: xszlo
日期: 2008.12.09
参数: FileName: string
返回值: string
作用: 得到文件的RCR32验证码
-------------------------------------------------------------------------------}
function TCRC.GetCRC32FileHexStr(FileName: string): string;
var
dcrc32: DWORD;
begin
GetCRC32File(FileName, dcrc32);
if dcrc32 <> 0 then
result := PChar(IntToHex(dcrc32, 6));
end;

{*------------------------------------------------------------------------------
生成字符CRC验证
@param
s string
Seed Integer
@throws 无
@return string
------------------------------------------------------------------------------*}
function TCRC.GetCrc32Str(s: string; Seed: Integer): string;
var
Count: Integer;
CrcVal: LongInt;
begin
MakeTable();
CrcVal := Seed;
for Count := 1 to Length(s) do
CrcVal := Table[Byte(CrcVal xor DWORD(Ord(s[Count])))] xor ((CrcVal shr 8) and $00FFFFFF);
Result := IntToHex(not (CrcVal), 8);
end;

{-------------------------------------------------------------------------------
过程名: TCRC.MakeTable
作者: xszlo
日期: 2008.12.09
参数: 无
返回值: 无
作用: 无
-------------------------------------------------------------------------------}
procedure TCRC.MakeTable;
var
i, j, Crc: integer;
begin
for i := 0 to 255 do
begin
Crc := i;
for j := 0 to 7 do
begin
if (Crc and 1) <> 0 then
Crc := (Crc shr 1) xor $EDB88320
else
Crc := Crc shr 1;
end;
Table[i] := Crc;
end;
end;

end.


------------
使用方法:
var
CRC:TCRC;

CRC:=TCRC.Create;
showmessage(CRC.GetCRC32FileHexStr('d:\a.txt'));
FreeAndNil(CRC);

本文地址:http://www.xszlo.com/article/2012-12-13/7628.html,转发请保留这个地址,谢谢
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值