//
/*写在最前面
我看了几个CRC16校验的源代码,发现它们都是直接使用数值来进行计算的,那样的话输入不是很方便,你得直接
输入八个二进制数对应的十进制数,并且能够校验的只是8*n个二进制数,不过那种有一个好处,计算速度快,并且
需要的内存空间也小。
我没按照那种方式来进行计算了,我把二进制的表示放到了一个字符串里面,也就是字符串里面的每一位表示一个二进制数,
比如二进制的110就用字符串"110"来表示,并且这个CRC16的校验是使用模2除法来弄的。
这种方式的有点就是你可以输入的M的长度随便,而且是直接输入01组成的二进制数,当然缺点就是牺牲了效率。
写了一个通用的模2除法函数,传入字符串表示的二进制的被除数、除数就能够得到商和余数(CRC16的时候商是没有用的),
这个函数可以给你显示出每一步的计算过程,如果你想看看它的计算过程的话,你把下面宏定义的SHOWPROCESS的值改为1就可以 看到,
这个函数我没有怎么去验证它是否正确,我自己随便举了几个数据计算,手算和它算是一样的。我用它计算了一下你们课本上的
那个,结果是一样的(如果开了显示过程的话,过程也是一样的)。
如果你不懂模2除法的计算过程的话你可以把显示计算过程开了(把下面宏定义的SHOWPROCESS的值改为1就可以),多举几个
数字进行计算,看看过程就可以弄懂的,显示计算过程也就是为了这。
因为没有直接对字符串表示的二进制进行异或的操作,因此就写了一个strxor来实现,它传入异或结果保存的空间和两个操作数就可以
得到结果。
讲讲什么是异或吧,异或就是相异(不同)的时候为1,相同的时候为0,比如
1xor0=1
1xor1=0
0xor1=1
oxor0=0
01010
xor 10100
= 11110
CRC16得到FCS和原来的M组到一块就是带校验帧的数据,你把这个数据在进行一次CRC16得到的FCS应该为0,这点我检查过多次,是正确的。。。:)
是努力的按照你们课本上的意思来实现的了,但是也有可能有错误。。。。。。
哦,提一下,输入的时候你就只输0和1就行,我没有做容错检查,其它的什么非01的字符就别尝试输入了,别为难机器。。。
不懂的问我,我今早没课的!
最后呢,早安、学习快乐!
*/
#include
#include
using namespace std;
#define SHOWPROCESS 0 //这个宏定义来控制是否显示模2的计算过程,值为0的时候不显示,值为1的时候显示
//该程序中二进制数用字符串表示,比如二进制的110就用"110"表示
//该函数完成二进制数的异或
//result保存异或的结果,s1和s2为两个二进制串
char* strxor(char *result, const char *s1, const char *s2)
{
int i=0;
while(s1[i] && s2[i]){
if(s1[i] != s2[i]){ //相异的时候为1
result[i] = '1';
}
else{ //相同则为0
result[i] = '0';
}
++i;
}
result[i] = '