码迷,mamicode.com
首页 > 其他好文 > 详细

CRC8算法DELPHI源码

时间:2014-05-22 16:29:09      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:style   class   blog   c   code   java   

bubuko.com,布布扣
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.
bubuko.com,布布扣

CRC8算法DELPHI源码,布布扣,bubuko.com

CRC8算法DELPHI源码

标签:style   class   blog   c   code   java   

原文地址:http://www.cnblogs.com/MaxWoods/p/3743981.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!