• 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.
  • 相关阅读:
    solr 重要的知识点
    Sole跟Tomcat的整合 Solr4.4 + Tomcat
    常用SQL总结
    T4生成实体和简单的CRUD操作
    磁盘分区
    salt一键部署zookeeper
    salt一键部署gcc-c++
    salt一键部署python
    linux目录文件权限的区别。
    salt一键部署jdk
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/3743981.html
Copyright © 2020-2023  润新知