CRC8演算法DELPHI原始碼

2021-04-06 16:34:43 字數 4006 閱讀 5151

最近做個程式需要用到crc8校驗,網上找了一堆資料都看得頭暈腦脹的,最終還是搞不懂它的演算法,慚愧。最後找了個c原始碼請高手翻譯成delphi的才解決問題。在這感謝 老鴇。。他寫的delphi程式如下:

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

原c程式:

原c程式如下:

/* crc校驗(8n) */

unsigned char crc_8n(unsigned char *ptr,unsigned char n)

else

crc=crc>>1;

crc_a=crc_a>>1;

// cbit=cbit<<1;

}while(--j);

}while(--n);

toggle_wd();

return crc;

} delphi翻譯版本:

unit crc8;

inte***ce

uses

classes, windows;

function crc_8n(p : array of byte; len : byte) : byte;

implementation

function crc_8n(p : array of byte; len : byte) : byte;

varj, 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;

inte***ce

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

public

end;

varform1: tform1;

implementation

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);

vars : 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.

CRC 8校驗原理及軟體實現

crc即迴圈冗餘校驗碼 是資料通訊領域中最常用的一種查錯校驗碼,其特徵是資訊字段和校驗欄位的長度可以任意選定。迴圈冗餘檢查 crc 是一種資料傳輸檢錯功能,對資料進行多項式計算,並將得到的結果附在幀的後面,接收裝置也執行類似的演算法,以保證資料傳輸的正確性和完整性。模2除法 模2除法與算術除法類似,...

怎麼除錯Delphi原始碼

delphi除錯概述2007 06 13 16 15delphi除錯入門級的經典文章,如果是新手的話此文值得好好的讀一讀 delphi除錯概述 除非你的程式只有幾行,否則幾乎不可能一次寫成,因此除錯就非常必要。然而許多初學者不知道如何進行除錯,寫完程式就執行,發現結果不對再看 這樣覺得非常吃力。這裡...

提公升程序令牌 Delphi原始碼

眾所周知,當我們要結束乙個程序時,可以呼叫windows api函式terminateprocess函式。但是,有很多程序依然還是無法結束的,這是因為程序許可權不夠,這時我們可以給程序提公升許可權再k掉k不掉的程序。一般程序獲取了sedebugprivilege許可權後都可以殺掉大部分程序了。提公升...