循环冗余校验码(CRC码)

本文详细介绍了循环冗余校验(CRC)的工作原理及其在数据传输中的应用,包括生成多项式的选择、模二除法的具体步骤以及CRC码的生成过程。同时,对比了CRC与海明码的不同之处,并探讨了CRC码的检错和纠错能力。

循环冗余校验码的思想:
在这里插入图片描述
例题:
在这里插入图片描述
在这里插入图片描述

注:
1.生成多项式即为约定的除数。
2.产生的余数为R位(比除数少一位)二进制数。
3.模二除法后得到的余数替换校验位,即得到对应的CRC码。

(CRC码除以约定的除数后等于0表示此次传输数据没有发生错误,反之则表示其中可能某些比特传输错误)
在这里插入图片描述

在这里插入图片描述
注:
1.这里与海明码不同,余数转换成十进制后的数与出错位没有必然的联系,例如,余数100转换成十进制后为4,但是出错位并不是4,而是3。
2.如果约定的除数不变,余数与出错位固定不变。

如图所示,给出了例题中出错位对应的余数:
在这里插入图片描述
例题中的余数有3位,说明可以表示8种状态,其中000代表传输正确,剩下001 ~ 111会分别表示1 ~ 7位出错,但是传输过去的CRC码一共有9位,剩下的2位会根据1 ~ 7位的出错余数循环表示。
所以说如果余数为010不一定会代表第2位出错,也有可能是第9位。

因为余数没有与出错位一一对应,这样子的CRC码好像只有检错能力,并没有起到纠错的功能,那是因为信息位太多
如:
在这里插入图片描述
因为这个弊端,通常CRC码在实际应用中只用来检错。
在这里插入图片描述

————————————————————————————————————————————————

《模二运算》

1、模二加的运算法则:

0+0=0, 0 + 1 = 1, 1+ 0 = 1, 1+ 1 = 0
理解:两个二进制数相加相减不考虑进位
例:
01 + 11 = 10,
对于两个数的低位都是1,进行模二和为0,但是没有进位,所以高位的0 加1 还是1,因为不考虑低位的进位。

2、模二减的运算法则:

0 - 0 = 0, 0 - 1 = 1, 1 - 0 = 1, 1 - 1 = 0
例:
1 0 1 0 - 0 1 1 0 = 1 1 0 0
上式的减法中,第三位的减法中0 - 1,如果按照二进制的减法是有借位的,但是对于模二减是没有借位的,所以才会有第四位中的1 - 0仍然为1。

综上:模二加、模二减的结果与异或运算相同。

3.模二除的运算法则:

以例题为例:
在这里插入图片描述
1.被除数首位为1时商1,为0时商0。
2.商乘以除数与被除数进行模二减法(异或运算)。
3.去除首位,其余位数进行异或运算,被除数再补位,得到的余数作为新的被除数。
4.往后重复这些步骤直到被除数没有位可以补下来为止。

4.模二乘运算法则:

0 * 0 = 0, 0 * 1 = 0, 1 * 0 = 0, 1 * 1 = 1
模二乘法的运算的乘法部分与普通多位二进制数运算相似,但是加法部分用的则是模二加运算。
————————————————————————————————————————————————

### 循环冗余校验码CRC的工作原理 循环冗余校验(Cyclic Redundancy Check, CRC)是一种基于除法和取模运算的数据验证方法,主要用于检测数据传输中的错误。其工作流程如下: 1. **生成多项式的选择**:发送方和接收方共同约定一个生成多项式 \(G(x)\),该多项式的系数决定了后续计算的具体方式。 2. **信息序列扩展**:假设原始消息长度为\(k\)比特,则在其后面附加\(r\)个零构成新的二进制串作为被除数,其中\(r\)等于生成多项式的最高次幂减去1。对于给定的例子,如果采用的生成多项式是\(G(x)=x^3+x^2+1\)[^1],那么就需要在原信息后补上三个0变成`1111000`或`1100000`的形式用于下一步处理。 3. **执行模2除法**:以上述得到的新字符串作为分子,以选定的生成多项式对应的二进制形式作为分母进行无借位的二进制除法操作直到不再含有前导'1'。所得余数即为要加入到实际传送的消息后面的检验字段——也就是所谓的“冗余位”。 4. **构建最终报文并发送**:将上述获得的冗余位连接至初始的信息之后形成完整的CRC后的帧结构准备发出;当对方接收到这个组合体时会重复相同的步骤来重新计算一次CRC值并与随同传来的那个做对比从而得知是否有误发生过。 5. **错误检测机制**:一旦发现两者不匹配就意味着途中出现了差错现象需要采取相应措施比如请求重发等动作确保通信质量可靠稳定[^2]。 ```cpp // C++实现简单的CRC-CCITT (XModem) 计算函数 unsigned short crc_ccitt(unsigned char *data_p, unsigned short length){ int i; unsigned short data; unsigned short crc = 0xFFFF; while(length--){ for(data=(crc>>8)^*data_p++,i=0;i<8;i++) crc = ((crc<<1)^((data&0x80)?0x1021:0)) & 0xffff, data <<= 1; } return(crc); } ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值