资讯详情

C语言:CRC校验

一、CRC码 CRC:Cylic Reduancy check译作汉语就是循环冗余校验码。 二、XOR XOR:逻辑运算符异或,不知道用符号怎么写,总之其运算法则是,不同为1,相同为0。 三、用XOR代替算术运算上除法的两个例子。 1、10110010000/11001 第一次异或(相除),得到商为1,余数为1111,加入下一位0,进行 第二次异或,得到商为1,余数为111,加入下一位1,余数为1111,四位与除数5位不能够异或计算,所以此处商为0,加入下一位0,进行 第三次异或,得到商为1,余数为111,同理第5位商为0,余数继续加入被除数的下一位0,进行 第四次异或,得到商为1,余数为101,加入后一位被除数的0,得到商为0,最终余数为1010,而最终商为1101010。计算流程如下图所示: 如若让被除数10110010000加上余数1010则为10110011010,再除以(异或)11001,则得到余数为0000(此处不再具体计算). 2、1111000/1001 经过三次异或(相除)得到商为1110,余数为110,具体例程如下, 同样,让该例的被除数1111000加上余数110后为1111110除以(异或)除数100则得到余数为000. 四、CRC校验原理 由以上两个例子可以看出,通信过程中加入想要传送的数据是“被除数”,加上余数后再传送。而接收一方接收完整数据后,除以除数,如果余数为0,则说明传送的数据正确,如果不为0则说明传送的数据有误。因为对于一个确定的“除数”,则就会有唯一的余数与之对应。这个过程其实就是一个CRC的校验过程。不过名称改一下不能叫做被除数 除数什么的。可以规定上述的除数叫做生成多项式或生成项,用g(x)表示。而余数就叫做CRC校验码。由以上知道,对于不同的生成项,则就会有唯一的CRC校验码与之对应。而对于要传送的数据也可以用一个系数仅为0和1取值的多项式一一对应。例如代码1010111对应的多项式为x^6+x^4+x^2+x+1.而多项式x^5+x^3+x^2+x+1对应的代码是101111. 实际上,上述的被除数并不是真正的要传送的数据,真正要传送的数据是一个多项式左移CRC校验码位数后的代码。定义CRC校验码的位数表示它本身的宽度。 另外,关于生成项,不难发现其最高位是1,实际上在除法的每次XOR时候都要被消掉,所以一般第一个1不做参考,后面的几位才是最重要的。这就是为什么生成项的位数比CRC宽度大1的原因。且生成项的最后一位也必须同时为1.一般生成项简写时候不写最高位的1.以下是各种常用的生成项表达式: CRC-4:x^4+x+1;-------------------------------->0x03 CRC-8:x^8+x^5+x^4+1;--------------------------->0x31 CRC-8:x^8+x^2+x^1+1;--------------------------->0x07 CRC-8:x^8+x^6+x^4+x^3+x^2+x;------------------->0x5E CRC-12:x^12+x^11+x^4+x^3+x+1;------------------>0x80 CRC-16:x^16+x^15+x^2+1;------------------------>0x80005 CRC-16:x^16+x^12+x^5+1;------------------------>0x1021 CRC-32:x^32+x^26 +x^23+....+x^2+x+1;------------>0x04C11 7 CRC-32:x^32+x^28 +x^27+.... +x^8+x^6+1;---------->0x1E6F41 五、C语言的实现 附录: -电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台