异或校验算法(又称为BCC校验)
下面就是异或校验的算法,多用于串口通信:
#include "stdio.h"
void main()
{
int i
//任意10个数值,也可以不是8位
unsigned char data[10]={0x12,0x21,0x1A,0xB1,0xC1,0xEB,0xDF,0xCA,0xF6,0xDD}
unsigned char out//用于保存异或结果
out=0x00
for (i=0i<sizeof(data)i++)
{
out^=data
}
printf("原来的校验值:%X\n",out)
out^=(data[0]^0xee)//将data[0]改为新数据后计算新校验和的方法
out^=(data[5]^0x20)//将data[5]改为新数据后计算新校验和的方法
printf("修改后校验值:%X\n",out)
data[0]=0xee//采用原始的方法计算新的校验和,和前面的校验和对比是否正确
data[5]=0x20//采用原始的方法计算新的校验和,和前面的校验和对比是否正确
out=0x00
for (i=0i<10i++)
{
out^=data
}
printf("原始方法得出校验值:%X\n",out)
}
作用:
防止自己的程序被篡改。
有些可执行程序,当被改了资源时再运行会有文件已损坏的提示,这就是使用了数据校验。本例是用md5做为数据校验的算法。当然你可以使用个性化的比如des作为数字签名,那样安全性更高。
扩展资料:
最简单的检验
实现方法:最简单的校验就是把原始数据和待比较数据直接进行比较,看是否完全一样这种方法是最安全最准确的。同时也是效率最低的。
应用例子:龙珠cpu在线调试工具bbug.exe。它和龙珠cpu间通讯时,bbug发送一个字节cpu返回收到的字节,bbug确认是刚才发送字节后才继续发送下一个字节的。
奇偶校验Parity Check
实现方法:在数据存储和传输中,字节中额外增加一个比特位,用来检验错误。校验位可以通过数据位异或计算出来。
应用例子:单片机串口通讯有一模式就是8位数据通讯,另加第9位用于放校验值。
md5校验和数字签名
实现方法:主要有md5和des算法。
适用范围:数据比较大或要求比较高的场合。如md5用于大量数据、文件校验,des用于保
密数据的校验(数字签名)等等。
应用例子:文件校验、银行系统的交易数据
参考资料:百度百科-数据校验
实现方法:最简单的校验就是把原始数据和待比较数据直接进行比较,看是否完全一样这种方法是最安全最准确的。同时也是效率最低的。应用例子:龙珠cpu在线调试工具bbug.exe。它和龙珠cpu间通讯时,bbug发送一个字节cpu返回收到的字节,bbug确认是刚才发送字节后才继续发送下一个字节的。 实现方法:在数据存储和传输中,字节中额外增加一个比特位,用来检验错误。校验位可以通过数据位异或计算出来。
应用例子:单片机串口通讯有一模式就是8位数据通讯,另加第9位用于放校验值。
bcc异或校验法(block check character)
实现方法:很多基于串口的通讯都用这种既简单又相当准确的方法。它就是把所有数据都和一个指定的初始值(通常是0)异或一次,最后的结果就是校验值,通常把它附在通讯数据的最后一起发送出去。接收方收到数据后自己也计算一次异或和校验值,如果和收到的校验值一致就说明收到的数据是完整的。
校验值计算的代码类似于:
unsigned uCRC=0//校验初始值
for(int i=0i<DataLenthi++) uCRC^=Data[i]
适用范围:适用于大多数要求不高的数据通讯。
应用例子:ic卡接口通讯、很多单片机系统的串口通讯都使用。 (Cyclic Redundancy Check)
实现方法:这是利用除法及余数的原理来进行错误检测的
异或,英文为exclusive OR,缩写成xor
异或(xor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“?”,计算机符号为“xor”。其运算法则为:
a?b = (¬a ∧ b) ∨ (a ∧¬b)
如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0?0=0,1?0=1,0?1=1,1?1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法。
异或略称为XOR、EOR、EX-OR
程序中有三种演算子:XOR、xor、?。
使用方法如下
z = x ? y
z = x xor y
扩展资料
运算法则
1)交换律:a ^ b = b ^ a。
2)结合律:a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;
d = a ^ b ^ c 可以推出 a = d ^ b ^ c。
3)自反性:a ^ b ^ a = b。
异或运算最常见于多项式除法,不过它最重要的性质还是自反性:
A^B^ B=A,即对给定的数A,用同样的运算因子(B)作两次异或运算后仍得到A本身。这是一个神奇的性质,利用这个性质,可以获得许多有趣的应用。例如,所有的程序教科书都会向初学者指出,要交换两个变量的值,必须要引入一个中间变量。但如果使用异或,就可以节约一个变量的存储空间:
设有A,B两个变量,存储的值分别为a,b,则以下三行表达式将互换他们的值表达式(值):
A=A^B(a^b);
B=B^A(b^a^b=a);
A=A^B(a^b^a=b)。
类似地,该运算还可以应用在加密,数据传输,校验等等许多领域。
x是二进制数0101;
y是二进制数1011;
则结果为x^y=1110;
0^0=0;0^1=1;1^0=1;1^1=0;
只有在两个比较的位不同时其结果是1,否则结果为0。
即“相同为0,不同为1”。
参考资料来源:百度百科-异或运算
参考资料来源:百度百科-异或 *** 作
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)