zoukankan      html  css  js  c++  java
  • 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.
  • 相关阅读:
    (二分查找 拓展) leetcode 69. Sqrt(x)
    (二分查找 拓展) leetcode 162. Find Peak Element && lintcode 75. Find Peak Element
    (链表) lintcode 219. Insert Node in Sorted Linked List
    (二分查找 拓展) leetcode 34. Find First and Last Position of Element in Sorted Array && lintcode 61. Search for a Range
    (最短路 Floyd) P2910 [USACO08OPEN]寻宝之路Clear And Present Danger 洛谷
    (字符串 数组 递归 双指针) leetcode 344. Reverse String
    (二叉树 DFS 递归) leetcode 112. Path Sum
    (二叉树 DFS 递归) leetcode 101. Symmetric Tree
    (二叉树 递归) leetcode 144. Binary Tree Preorder Traversal
    (二叉树 递归 DFS) leetcode 100. Same Tree
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/3743981.html
Copyright © 2011-2022 走看看