最近做個程式需要用到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許可權後都可以殺掉大部分程序了。提公升...