最近做个程序需要用到CRC8校验,网上找了一堆资料都看得头晕脑胀的,最终还是搞不懂它的算法,惭愧。最后找了个C源码请高手翻译成DELPHI的才解决问题。在这感谢 老鸨。。他写的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.
[系统软件]InstallShield Express for delphi制作安装程序定… [常用软件]InstallShield Express制作Delphi数据库安装程序 [Delphi程序]为什么选择Delphi.Net ? [Delphi程序]《关于VisiBroker For Delphi的使用》(4) [Delphi程序]Delphi 程序员代码编写标准指南 [Delphi程序]转贴:Conversion to Delphi 6: Missing unit Pro… [Delphi程序]Borland Delphi 9 的新特性 [Delphi程序]Delphi 键盘码表 [Delphi程序]Chuck Jazdzewski的离开意味着Delphi的终结吗? [Delphi程序]Delphi Access violations 问题的解决之道
|