CRC循环冗余码的C语言实现

来源:互联网 发布:初恋怪兽 知乎 编辑:程序博客网 时间:2024/05/16 10:28

关于循环冗余码的定义,可以百度:http://baike.baidu.com/view/575295.htm#sub575295

 

计算余数的二进制除法

第一步,要在数据位(被除数)后边补00的个数比除数(生成多项式)少一位。

第二步,做除法,从被除数的头五位减去五位的除数。除数的每一位都与被除数的对应位在不涉及上一位的情况下独立进行减法(实际进行的是模2加)。在本例中,除数11001与被除数的前五位10110进行的是模2加,得到1111(余数1前面的0被省略)。

在被除数中下一个没有使用过的比特接着被抄录下来,使得余数的位数和除数的位数相同。如果位数不够,在商位补0(这与一般除法相同),因此,下一步就是11110Å11001,结果是111,依次类推。

在二进制除法中,除数总是以1开头的,然后从上一次的被除数/余数中与除数位数相同的部分中减去除数,并且只能从最左位是1的被除数/余数中减去除数。每当被除数/余数的最左位是0时,就在该步骤中把0丢弃,再把被除数中的下一个未使用比特抄录下来填充余数,同时对应的商数位补一个零,并按上述方法进行二进制除法运算,一直重复这个过程直到被除数中所有比特都被使用过。

余数100只有3位,而余数应为4位(比除数少一位),因此,取校验码时应在前面填一个0,故其CRC校验码应为0100,于是可求出该信息码的循环冗余码为101100110100

为了判断传输的正确性,在接收端要有一个CRC校验器。它的功能和发生器一样,当收到CRC冗余校验码后,做同样的模2除法(注意,这里采用的生成多项式一定要与发送端相同)。如果余数是全0,则说明传输正确;否则,传输错误,应重传。