关于循环冗余码的定义,可以百度:http://baike.baidu.com/view/575295.htm#sub575295
计算余数的二进制除法
第一步,要在数据位(被除数)后边补 0 , 0 的个数比除数(生成多项式)少一位。
第二步,做除法,从被除数的头五位减去五位的除数。除数的每一位都与被除数的对应位在不涉及上一位的情况下独立进行减法(实际进行的是模 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 ,则说明传输正确;否则,传输错误,应重传。
#include #include #include #include #include using namespace std; char s1[50]; //存放特定的CRC char s2[50]; //存放要传输的二进制串 char s[50]; //存放转化好的信息码 int len,len1; void to_binary(int n) { s[len++]=','; len1--; stackq; while(n) { q.push(n%2); n/=2; len1--; } while(len1>0) { q.push(0); len1--; } while(!q.empty()) { int x=q.top(); s[len++]=x+'0'; q.pop(); } s[len++]='/0'; } int num(int n) { if(n==0) return 1; int count=1; while(n!=1) { count++; n>>=1; } return count; } int f(int a,int b) { if(num(a)>=(x-y); a=a^b; a<<=(x-y); int k=t&((1<