as3852711 发表于 2008-9-2 21:04:39

DELPHI如何实现CRC校验?

DELPHI如何实现CRC校验?想写个小程序?用CRC校验防破解?那为能给个例子看看?

ghost539 发表于 2008-9-10 22:22:46

刚来的 不清楚/:012

xingke 发表于 2008-9-15 17:24:46

CRC8算法DELPHI源码

unit Crc8;
inte**ce
Uses
Classes, Windows;
Function Crc_8n(p : array of BYTE; len : BYTE) : Byte;
implementation
Function Crc_8n(p : array of BYTE; len : BYTE) : Byte;
Var
j, cbit, aout, crc, crc_a, crc_b : Byte;
i : integer;
begin
crc := 0;
i := 0;
// 取移位的位
repeat
   crc_a := p;
    inc(i);
   j := 8;
   cbit := 1;
    repeat
      crc_b := crc_a;
   crc_b := crc_b xor crc; // ?????
   aout := crc_b and cbit;
   if aout<>0 then begin
      crc := crc xor $18; // ?????
      crc := crc shr 1;
      crc := crc or $80;
   end else begin
       crc := crc shr 1;
   end;
   crc_a := crc_a shr 1;
      dec(j);
    until j = 0;
    dec(len);
until len = 0;
result := crc;
end;
end.

=================================

unit main;
inte**ce
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,
Crc8;
type
TForm1 = class(TForm)
    Edit1: TEdit;
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
private
    { Private declarations }
public
    { Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const MinBase = 2;
      MaxBase = 36;
      
function StrToNum (const s: string; base: Integer;
                   neg: Boolean; max: Integer): Integer;
// s = 要转换的字符串
// base = 进制数
// neg = 是否为负数
// max = 要转换的最大数//
// 用法:
// i:= StrToNum (''''''''00101101'''''''', 2, false, MaxInt);
// i:= StrToNum (''''''''002D'''''''', 16, false, MaxInt);
// i:= StrToNum (''''''''-45'''''''', 10, true, MaxInt);
// i:= StrToNum (''''''''ZZ'''''''', 36, true, MaxInt);
//
var negate, done: Boolean;
    i, len, digit, mmb: Integer;
    c: Char;
    mdb, res: Integer;
begin
res:= 0;i:= 1;digit:= 0;
if (base >= MinBase) and (base <= MaxBase) then begin
mmb:= max mod base;
mdb:= max div base;
len:= Length (s);
negate:= False;
while (i <= len) and (s = '''' '''') do Inc (i);
if neg then begin
   case s of
    ''''+'''': Inc (i);
    ''''-'''': beginInc (i);negate:= TRUE; end;
   end; (* CASE *)
end; (* IF neg *)
done:= len > i;
while (i <= len) and done do begin
   c:= Upcase (s);
   case c of
    ''''0''''..''''9'''': digit:= ORD(c) - 48;
    ''''A''''..''''Z'''': digit:= ORD(c) - 55;
    else      done:= FALSE
   end; (* CASE *)
   done:= done and (digit < base);
   if done then begin
    done:= (res < mdb) or ((res = mdb) and (digit <= mmb));
    IF done then begin
   res:= res * base + digit;
   Inc (i);
    end; (* IF done *)
   end; (* IF done *)
end; (* WHILE *)
if negate then res:= - res;
end; (* IF done *)
Result:= res;
end;
procedure TForm1.Button1Click(Sender: TObject);
Var
S : String;
P : Array of Byte;
Len : Byte;
R : Byte;
I : Integer;
begin
S := Edit1.Text;
if length(s) mod 2 = 1 then s := s + ''''0'''';
Memo1.Lines.Add(S + '''' :'''');
for i:=1 to length(s) div 2 do begin
    p := BYTE(StrToNum(copy(s, (i-1)*2+1, 2), 16, false, 500));
    Memo1.Lines.Add(IntToStr(I) + '''' --> '''' + IntToHex(p, 2));
end;
Len := length(s) div 2;
R := Crc_8n(P, Len);
Memo1.Lines.Add(''''Crc8 Result: '''' + IntToHex(R, 2));
end;
end.
页: [1]
查看完整版本: DELPHI如何实现CRC校验?