循环冗余码c语言程序,CRC循环冗余码的C语言实现

关于循环冗余码的定义,可以百度: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<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值