飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4309|回复: 2

DELPHI如何实现CRC校验?

[复制链接]
  • TA的每日心情
    郁闷
    2021-10-2 23:26
  • 签到天数: 46 天

    [LV.5]常住居民I

    发表于 2008-9-2 21:04:39 | 显示全部楼层 |阅读模式
    DELPHI如何实现CRC校验?想写个小程序?用CRC校验防破解?那为能给个例子看看?
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-9-10 22:22:46 | 显示全部楼层
    刚来的 不清楚/:012
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-6-9 16:20
  • 签到天数: 24 天

    [LV.4]偶尔看看III

    发表于 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);
        ''''-'''': begin  Inc (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[0..255] 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[i-1] := BYTE(StrToNum(copy(s, (i-1)*2+1, 2), 16, false, 500));
        Memo1.Lines.Add(IntToStr(I) + '''' --> '''' + IntToHex(p[i-1], 2));
      end;
      Len := length(s) div 2;
      R := Crc_8n(P, Len);
      Memo1.Lines.Add(''''Crc8 Result: '''' + IntToHex(R, 2));
    end;
    end.
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表