CRC8算法DELPHI源码

 
  最近做个程序需要用到CRC8校验,网上找了一堆资料都看得头晕脑胀的,最终还是搞不懂它的算法,惭愧。最后找了个C源码请高手翻译成DELPHI的才解决问题。在这感谢 老鸨。。他写的DELPHI程序如下:

//***** lanyus*******//

原C程序:

原C程序如下:

/* CRC校验(8N) */

unsigned char Crc_8n(unsigned char *ptr,unsigned char n)
{
unsigned char j=8;
unsigned char cbit,out;
unsigned char crc=0,crc_a=0,crc_b=0;
/*取移位的位*/
TOGGLE_WD();
do{
crc_a=*ptr;
ptr++;
j=8;
cbit=1;
do{
crc_b=crc_a;
crc_b=crc_b^crc;
out=crc_b&cbit;
// crc_b=crc_b>>1;
if(out!=0)
{
crc=crc^0X18;
crc=crc>>1;
crc|=0x80;
}else
crc=crc>>1;
crc_a=crc_a>>1;
// cbit=cbit<<1;
}while(--j);
}while(--n);
TOGGLE_WD();
return crc;
}

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.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CRC(Cyclic Redundancy Check)循环冗余校验是一种简单且高效的错误检测算法,广泛应用于数据传输中的错误检测和校正。 CRC8和CRC16是两种常用的CRC校验算法。其中,CRC8算法用于校验8位字节或数据流的校验和CRC16算法则用于校验16位字节或数据流的校验和CRC16算法CRC8算法更复杂,但CRC16的校验结果更可靠。CRC16算法在计算校验和时,使用一个16位的生成多项式,并且每次处理一个16位数据流。而CRC8算法则使用一个8位的生成多项式,每次处理一个8位数据流。 具体来说,CRC8算法首先需要一个初始值,然后依次读入每个数据字节,进行位运算和异或操作,最终计算出一个8位校验和CRC16算法与其类似,只不过初始化值更大,多项式也更长,计算结果也是一个16位的校验和。 虽然CRC算法的实现较为复杂,但它被广泛运用于通信和数据传输领域,因为它可以快速检测并校正数据传输过程中出现的错误。 ### 回答2: CRC算法是一种很常见的校验算法,其中最常见的两种是crc8和crc16算法CRC8算法是将传输的数据进行异或运算,并采取模2除法,将结果存储于一个8位寄存器中,最后输出8位的校验码。这种算法主要用于串行通信协议、存储设备和传感器网络。 CRC16算法是将输入数据除以一个特定的多项式,余数即为校验码。这种算法具有很高的误检率,可以在大多数场合用于通信的数据完整性检验。常见的应用包括:以太网、通讯协议、Modbus、X.25、SD卡等。与CRC8相比,CRC16可以检测更多的错误位。 在实际应用中,CRC算法通常需要选取合适的生成多项式,来保证算法的稳定性和准确性。同时,为了避免非正常条件下的错误数据干扰,可以在校验码中加入一定的冗余信息。 ### 回答3: CRC(Cyclic Redundancy Check)是一种校验算法,主要用于检测数据传输的出错情况。在计算机通信、存储等领域广泛应用。CRC算法可以检测出数据传输过程中的单比特差错和位移差错,但是它并不能检测出所有的差错。CRC算法是一种哈希函数的变种,通常采用多项式计算方法。 CRC算法的计算可以分为两个部分:生成表格和计算crc值。生成表格是为了在计算crc过程中快速地查找异或表格的值,而不必每次都进行一次多项式除法。生成表格的方法是将0~255的所有值带入多项式中进行计算,得到一个256位的表格。计算crc值时,将数据流和发送方预设的一个初始值一起丢进异或表格,对每一位进行异或,最后得到的结果就是crc值。 CRC算法有各种各样的规范,如CRC8、CRC16等,不同的规范所采用的多项式也不尽相同。其中,CRC8是一种8位循环冗余校验码,常用于通信协议中,如Modbus、I2C。CRC16是一种16位循环冗余校验码,常用于串口协议和Modbus RTU。 基于不同的多项式,CRC8和CRC16的校验强度也不同。通常来说,CRC16的校验强度要比CRC8高。但是由于CRC16需要计算的多项式位数较多,所以在计算速度上要比CRC8慢。因此,在实际应用中,需要根据具体的场景选择不同的CRC算法。 总之,CRC8和CRC16算法是数据通信中经常使用的一种校验算法。它能够快速检测出数据传输过程中的错误,保证数据的完整性和可靠性。在实际应用中,需要根据不同的场景和要求选择不同的CRC算法,以实现更好的校验效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值