单片机常用校验方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
常见校验算法
一、校验算法
奇偶校验(单字节奇偶校验和多字节奇偶校验)
MD5校验
求校验和
BCC(Block Check Character/信息组校验码),常说的异或校验方法
CRC(Cyclic Redundancy Check/循环冗余校验)
LRC(Longitudinal Redundancy Check/纵向冗余校验)
二、奇偶校验
内存中最小的单位是比特,也称为“位”,位有只有两种状态分别以1和0来标示,每8个连续的比特叫做一个字节(byte)。不带奇偶校验的内存每个字节只有8位,如果其某一位存储了错误的值,就会导致其存储的相应数据发生变化,进而导致应用程序发生错误。而奇偶校验就是在每一字节(8位)之外又增加了一位作为错误检测位。在某字节中存储数据之后,在其8个位上存储的数据是固定的,因为位只能有两种状态1或0,假设存储的数据用位标示为1、1、1、0、0、1、0、1,那么把每个位相加(1+1+1+0+0+1+0+1=5),结果是奇数,那么在校验位定义为1,反之为0。当CPU读取存储的数据时,它会再次把前8位中存储的数据相加,计算结果是否与校验位相一致。从而一定程度上能检测出内存错误,奇偶校验只能检测出错误而无法对其进行修正,同时虽然双位同时发生错误的概率相当低,但奇偶校验却无法检测出双位错误
三、MD5校验
MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc 发明,由MD2/MD3/MD4 发展而来的。MD5的实际应用是对一段Message(字节串)产生fingerprint(指纹),可以防止被“篡改”。举个例子,天天安全网提供下载的MD5校验值软件WinMD5.zip,其MD5值是1e07ab3591d25583eff5129293dc98d2,但你下载该软件后计算MD5 发现其值却是81395f50b94bb4891a4ce4ffb6ccf64b,那说明该ZIP已经被他人修改过,那还用不用该软件那你可自己琢磨着看啦。
四、求校验和
求校验和其实是一种或运算。如下:
//--------------------------------------------------------------------------------------------------
//如下是计算校验位函数
// checkdata,包括起始位在内的前九位数据的校验和
//--------------------------------------------------------------------------------------------------
unsigned char CLU_checkdata(void)
{ //求校验和
unsigned char checkdata=0;
for(point=0;point<9,TI=1;point++)
{
checkdata=checkdata | buffer[point];
}
return(checkdata);
}
四、BCC(Block Check Character/信息组校验符号)
BCC校验其实是奇偶校验的一种,但也是经常使用并且效率较高的一种,所谓BCC校验法(block check character),就是在发送前和发送后分别把BCC以前包括ETX字符的所有字符按位异或后,按要求变换(增加或前去一个固定的值)后所得到的字符进行比较,相等即认为通信无错误,不相等则认为通信出错.
非接触卡读卡器与PC机的通讯格式如下:
STX(02H)+ 6个字节的卡号+VERH+VERL+EOT(04H)
STX(02H)起始字节
EOT(04H)结束字节
6个字节的卡号为六个十六进制的ASCII字符,6个字节的传送,高字节在前,低字节在后。例如:
卡号:8 D E F 9 E
传输的数据格式:38 44 45 46 39 45 (十六进制)
在校验时采用目前最通用的BCC校验方式:
具体的方法是:
将有效的卡号接字节作异或(XOR)校验:
38H (XOR)44H (XOR)45H (XOR)46H (XOR)39H(XOR)45H =03H
然后将接收到的数据VERH+VERL合成一个字节数据,30H(HEX)=0,33H(HEX)=3
合成数据为03H,接收到的数据与我们收到的卡号的校验数据一致,则接收到
的卡号为正确卡号。
再比如现有卡号为:
卡号:0 5 8 E 4 2
传输的数据格式:30 35 38 45 34 32 (十六进制)
在校验时采用目前最通用的BCC校验方式:
具体的方法是:
将有效的卡号接字节作异或(XOR)校验:
30H (XOR)35H (XOR)38H (XOR)45H (XOR)34H(XOR)32H =7EH
然后将接收到的数据VERH+VERL合成一个字节数据,37H(HEX)=7,45H(HEX)=E
合成数据为7EH,接收到的数据与我们收到的卡号的校验数据一致,则接收到
的卡号为正确卡号。
在编写程序时,可以先将所有数据都接收到计算机的内存中,然后计算BCC校验值VALUE1,再将接收的BCC值
拼成一个十六进制数VALUE2,然后比较这两个值,如果相等,则接收到的卡号为合法卡号,然后按您的系统
作相应的处理。
VB代码如下:
Public Function bcc(a As String) As String
Dim b As Integer
b = 0
For i = 1 To Len(a) Step 2
b = b Xor ("&h" + Mid(a, i, 2))
Next
b = b And &HFF