和校驗(yàn)好。
創(chuàng)新互聯(lián)建站主營(yíng)內(nèi)江網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,app軟件定制開(kāi)發(fā),內(nèi)江h(huán)5重慶小程序開(kāi)發(fā)搭建,內(nèi)江網(wǎng)站營(yíng)銷(xiāo)推廣歡迎內(nèi)江等地區(qū)企業(yè)咨詢
和校驗(yàn)又稱累加和校驗(yàn)。和校驗(yàn)按每個(gè)字節(jié),計(jì)算累加和。異或校驗(yàn)定義初值,按每個(gè)字節(jié)異或,求結(jié)果。異或校驗(yàn)又稱異或和校驗(yàn)或者BCC校驗(yàn)。BCCcheck是比較常用的串口數(shù)據(jù)校驗(yàn)。檢驗(yàn)和的概念一般體現(xiàn)在8bit長(zhǎng)度的字符數(shù)組。注意異或校驗(yàn)是異或運(yùn)算,需要先強(qiáng)制把字符轉(zhuǎn)換成整形數(shù)據(jù)。
校驗(yàn),是一個(gè)數(shù)學(xué)術(shù)語(yǔ),是數(shù)據(jù)傳送時(shí)采用的一種校正數(shù)據(jù)錯(cuò)誤的一種方式,分為奇校驗(yàn)和偶校驗(yàn)兩種。分析國(guó)內(nèi)外對(duì)校驗(yàn)的用法,其含意基本相同,它與檢定和校準(zhǔn)均有一定聯(lián)系又有明顯區(qū)別。它不具有法制性與校準(zhǔn)相同,它在技術(shù)操作內(nèi)容上又與檢定有共性,一般可進(jìn)行校準(zhǔn),也可以對(duì)其它有關(guān)性能進(jìn)行規(guī)定的檢驗(yàn),并最終給出合格性的結(jié)論。這一術(shù)語(yǔ)有時(shí)是很必要的,建議在有關(guān)術(shù)語(yǔ)定義中應(yīng)當(dāng)給校驗(yàn)一個(gè)正式的位置,以統(tǒng)一和規(guī)范其使用。
Private?Sub?cmdSendHex_Click()?'16進(jìn)制發(fā)送
Dim?sj()?As?Byte
Dim?sj_Txt?As?String
Dim?i?As?Integer
sj_Txt?=?TxtSend
If?Len(TxtSend)?Mod?2?=?0?And?Len(TxtSend)??0?Then?'檢驗(yàn)16進(jìn)制字符串長(zhǎng)
ReDim?sj(Len(sj_Txt)?/?2?-?1)
For?i?=?0?To?Len(sj_Txt)?-?1?Step?2
sj(i?/?2)?=?Val("H"??Mid(sj_Txt,?i?+?1,?2))
Next
Print?Hex(sj(0)?Xor?sj(1)?Xor?sj(2))
Else
MsgBox?("格式不對(duì)!")
End?If
Text1?=?TxtSend??Right("0"??Hex(sj(0)?Xor?sj(1)?Xor?sj(2)),?2)
End?Sub
Private?Sub?Form_Load()
TxtSend?=?"010308"
注意,LZ的另一問(wèn)帖,我已經(jīng)做了回復(fù).
改成:
For i As Integer = 0 To buffer.Length - 1
checksum = checksum Xor Asc(buffer(i))
Next
異或在計(jì)算機(jī)二進(jìn)制運(yùn)算中是一種常用運(yùn)算,最常見(jiàn)于數(shù)據(jù)的簡(jiǎn)單加密?!∷倪\(yùn)算規(guī)則是這樣的,兩組數(shù)據(jù)對(duì)位后進(jìn)行比較——相同,即同為0或同為1,輸出0;不同,輸出1?!】聪旅娴睦?,你會(huì)掌握異或運(yùn)算:(第一組數(shù)據(jù))?。?011 0011 0011 0011(第二組數(shù)據(jù))?。?000 1111 0011 1100(異或運(yùn)算結(jié)果):0011 1100 0000 1111 ————————————————————————————————————我們先把校驗(yàn)對(duì)象(31 30 34 32 H)劃成二進(jìn)制:0011 0001 0011 0000 0011 0100 0011 0010 把校驗(yàn)多項(xiàng)式(18 0D H)劃成二進(jìn)制:0001 1000 0000 1101 據(jù)CRC12校驗(yàn)規(guī)則,被除數(shù)為校驗(yàn)對(duì)象后加12個(gè)“0”,除數(shù)為校驗(yàn)多項(xiàng)式,運(yùn)算時(shí)以高位對(duì)齊。以下使用計(jì)算法對(duì)校驗(yàn)對(duì)象進(jìn)行CRC12校驗(yàn)。在每次計(jì)算前,高位去零,一直計(jì)算到被除數(shù)位數(shù)少于除數(shù)位數(shù)時(shí)停止?!∮?jì)算過(guò)程:校驗(yàn)對(duì)象: 0011 0001 0011 0000 0011 0100 0011 0010被除數(shù) → 0011 0001 0011 0000 0011 0100 0011 0010 0000 0000 0000校驗(yàn)多項(xiàng)式:0001 1000 0000 1101除數(shù) → 1 1000 0000 1101 高位去零,對(duì)齊后進(jìn)行異或運(yùn)算: 110001001100000011010000110010000000000000
/1100000001101
=000001001010100011010000110010000000000000(高位去零,再次運(yùn)算) 1001010100011010000110010000000000000
/1100000001101
=0101010101110010000110010000000000000(高位去零,再次運(yùn)算) 101010101110010000110010000000000000
/1100000001101
=011010101000110000110010000000000000(高位去零,再次運(yùn)算) 11010101000110000110010000000000000
/1100000001101
=00010101011100000110010000000000000(高位去零,再次運(yùn)算) 10101011100000110010000000000000
/1100000001101
=01101011111010110010000000000000(高位去零,再次運(yùn)算) 1101011111010110010000000000000
/1100000001101
=0001011110111110010000000000000(高位去零,再次運(yùn)算) 1011110111110010000000000000
/1100000001101
=0111110110011010000000000000(高位去零,再次運(yùn)算) 111110110011010000000000000
/1100000001101
=001110110101110000000000000(高位去零,再次運(yùn)算) 1110110101110000000000000
/1100000001101
=0010110100011000000000000(高位去零,再次運(yùn)算) 10110100011000000000000
/1100000001101
=01110100000010000000000(高位去零,再次運(yùn)算) 1110100000010000000000
/1100000001101
=0010100001111000000000(高位去零,再次運(yùn)算) 10100001111000000000
/1100000001101
=01100001100010000000(高位去零,再次運(yùn)算) 1100001100010000000
/1100000001101
=0000001101111000000(高位去零,再次運(yùn)算) 1101111000000
/1100000001101
=0001111001101(高位去零,符合終止條件)=1111001101 所以,CRC12校驗(yàn)結(jié)果:11 1100 1101 →(十六進(jìn)制)→ 3CDH————————————————————————————————————看你自己能不能理解,CRC12校驗(yàn)類模塊寫(xiě)好了再給你發(fā)過(guò)去。
xor表示雙重作用,
textstyle = textstyle Xor FontStyle.Italic
就是說(shuō),在原來(lái)的基礎(chǔ)上實(shí)現(xiàn)雙重功能結(jié)合,比如你原來(lái)的字體是 加粗的,在運(yùn)行這句語(yǔ)句后,就實(shí)驗(yàn)了加粗和傾斜的功能了,如果不用xor,實(shí)現(xiàn)就很麻煩了
異或校驗(yàn)算法(又稱為BCC校驗(yàn))
下面就是異或校驗(yàn)的算法,多用于串口通信:
#include "stdio.h"
void main()
{
int i;
//任意10個(gè)數(shù)值,也可以不是8位
unsigned char data[10]={0x12,0x21,0x1A,0xB1,0xC1,0xEB,0xDF,0xCA,0xF6,0xDD};
unsigned char out;//用于保存異或結(jié)果
out=0x00;
for (i=0;isizeof(data);i++)
{
out^=data;
}
printf("原來(lái)的校驗(yàn)值:%X\n",out);
out^=(data[0]^0xee);//將data[0]改為新數(shù)據(jù)后計(jì)算新校驗(yàn)和的方法
out^=(data[5]^0x20);//將data[5]改為新數(shù)據(jù)后計(jì)算新校驗(yàn)和的方法
printf("修改后校驗(yàn)值:%X\n",out);
data[0]=0xee; //采用原始的方法計(jì)算新的校驗(yàn)和,和前面的校驗(yàn)和對(duì)比是否正確
data[5]=0x20; //采用原始的方法計(jì)算新的校驗(yàn)和,和前面的校驗(yàn)和對(duì)比是否正確
out=0x00;
for (i=0;i10;i++)
{
out^=data;
}
printf("原始方法得出校驗(yàn)值:%X\n",out);
}
作用:
防止自己的程序被篡改。
有些可執(zhí)行程序,當(dāng)被改了資源時(shí)再運(yùn)行會(huì)有文件已損壞的提示,這就是使用了數(shù)據(jù)校驗(yàn)。本例是用md5做為數(shù)據(jù)校驗(yàn)的算法。當(dāng)然你可以使用個(gè)性化的比如des作為數(shù)字簽名,那樣安全性更高。
擴(kuò)展資料:
最簡(jiǎn)單的檢驗(yàn)
實(shí)現(xiàn)方法:最簡(jiǎn)單的校驗(yàn)就是把原始數(shù)據(jù)和待比較數(shù)據(jù)直接進(jìn)行比較,看是否完全一樣這種方法是最安全最準(zhǔn)確的。同時(shí)也是效率最低的。
應(yīng)用例子:龍珠cpu在線調(diào)試工具bbug.exe。它和龍珠cpu間通訊時(shí),bbug發(fā)送一個(gè)字節(jié)cpu返回收到的字節(jié),bbug確認(rèn)是剛才發(fā)送字節(jié)后才繼續(xù)發(fā)送下一個(gè)字節(jié)的。
奇偶校驗(yàn)Parity Check
實(shí)現(xiàn)方法:在數(shù)據(jù)存儲(chǔ)和傳輸中,字節(jié)中額外增加一個(gè)比特位,用來(lái)檢驗(yàn)錯(cuò)誤。校驗(yàn)位可以通過(guò)數(shù)據(jù)位異或計(jì)算出來(lái)。
應(yīng)用例子:?jiǎn)纹瑱C(jī)串口通訊有一模式就是8位數(shù)據(jù)通訊,另加第9位用于放校驗(yàn)值。
md5校驗(yàn)和數(shù)字簽名
實(shí)現(xiàn)方法:主要有md5和des算法。
適用范圍:數(shù)據(jù)比較大或要求比較高的場(chǎng)合。如md5用于大量數(shù)據(jù)、文件校驗(yàn),des用于保
密數(shù)據(jù)的校驗(yàn)(數(shù)字簽名)等等。
應(yīng)用例子:文件校驗(yàn)、銀行系統(tǒng)的交易數(shù)據(jù)
參考資料:百度百科-數(shù)據(jù)校驗(yàn)