CRC16校验 模二除法

2019-04-13 11:53发布

// /*写在最前面 我看了几个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] = '