首页 > 代码库 > CRC8算法DELPHI源码
CRC8算法DELPHI源码
unit Crc8; interface 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[i]; 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; interface 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[i] = ‘‘‘‘ ‘‘‘‘) do Inc (i); if neg then begin case s[i] 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[i]); 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.
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。