一文搞懂奇偶校验、海明码和CRC
![](https://up.ctext.top/article/2024/03/verify.png)
AI-摘要(由百度千帆大模型提供生成摘要能力)
Tianli GPT
AI初始化中...
介绍自己 🙈
生成本文简介 👋
推荐相关文章 📖
前往主页 🏠
前往爱发电购买
一文搞懂奇偶校验、海明码和CRC
伴随1. 为什么要有校验码?
2. 奇偶校验
校验位的计算
- 奇校验 :如果数据单元中1的数量已经是奇数,则校验位设置为0;否则,校验位设置为1。
- 偶校验 :如果数据单元中1的数量已经是偶数,则校验位设置为0;否则,校验位设置为1。
举个栗子🌰
一个七位数的数据单元1011011
- 奇校验编码:01011011
- 偶校验编码:11011011
总结
2. CRC(循环冗余校验)
校验位的计算
- 首先通过给定的生成多项式来确定除数,然后将要进行校验或者编码的数据进行模2除法(异或),取最后的余数然后与数据为拼接即可
举个栗子🌰
假设要传输的数据为1101011011,给定的生成多项式为G(X)=x4+x+1
根据题目中的生成多项式可以得出除数为10011,下面开始进行计算:
1 | 1100001010 |
经过上面的计算得出校验码位1110,所以实际发送的数据为11010110111110
当客户端收到这个数据之后,要进行CRC校验
1 | 110000101 |
3. 海明校验码
校验位与数据位的关系
- 2k−1>=m+k
举个栗子🌰
假设原始数据为01101110
位置 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|---|---|
原始信息位 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
根据上述公式,当 m(信息位)=8时,k(校验位)最小可以取 4 ,所以可以得到如下表格:
位置 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
新的信息位 | 0 | 1 | 1 | 0 | H8 | 1 | 1 | 1 | H4 | 0 | H2 | H1 |
下面开始计算校验位的值
十进制对应二进制的数字如下
位置 | 二进制码 |
---|---|
1 | 0001 |
2 | 0010 |
3 | 0011 |
4 | 0100 |
5 | 0101 |
6 | 0110 |
7 | 0111 |
8 | 1000 |
9 | 1001 |
10 | 1010 |
11 | 1011 |
12 | 1100 |
海明码 | 出现的位置 | 对应位置上的值异或 | 结果 |
---|---|---|---|
H1 | 3,5,7,9,11 | 0⊕1⊕1⊕0⊕1 | 1 |
H2 | 3,6,7,10,11 | 0⊕1⊕1⊕1⊕1 | 0 |
H4 | 5,6,7,12 | 1⊕1⊕1⊕0 | 1 |
H8 | 9,10,11,12 | 0⊕1⊕1⊕0 | 0 |
通过上面的计算,我们就可以得到一个经过编码之后的数据:0110 0111 1001
位置 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
最终信息位 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 |
接收端收到对应的数据之后,开始校验数据是否有错误
假设 0110 0111 1001 ->传输为 0111 0111 1001
继续根据上面的方式,重新计算H1,H2,H4,H8校验位,计算的结果为1100
然后拿之前的校验码和新算出来的校验码求异或0101 ⊕ 1100 = 1001 = 9,所以可以判断出是第9位出现了错误,修改之后就完成了纠错
如果你认真的看到这里,你一定会有一个疑问,如果出现两个以上的错误时,还能纠错吗?下面实践一下
栗子2🌰
假设出现了两个数据位的错误 0110 0111 1001 ->传输为 0101 0111 1001
位置 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
最终信息位 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 |
再次计算校验位H1,H2,H4,H8为0110
再次与之前的校验码求异或 0101 ⊕ 0110 = 0011 = 3
按照这次的计算结果来看,是第三位数据出现了问题,但是很明显我们出错的是第9,10位,但是,当你把第三位修改之后,再次进行校验,发现没有问题了😗
最终总结
特点 | 奇偶校验 | CRC | 海明码 |
---|---|---|---|
原理 | 在数据中添加一个额外的校验位,使整个数据的1的个数为奇数(奇校验)或偶数(偶校验),用于检测单个比特的错误。 | 利用除法操作,在发送的数据后面附加一个固定长度的校验码(CRC码),接收端通过相同的除法操作验证数据的完整性。 | 通过在数据中添加冗余位(校验位),使得整个码字中特定位置的位数(1的个数)具有确定的奇偶性,以便检测和纠正错误。 |
错误检测能力 | 只能检测单个比特的错误,对于两个或更多比特的错误可能无法检测。 | 能够检测并纠正多个比特的错误,具体取决于CRC码的长度。 | 可以检测并纠正单个比特的错误,有时还能检测并纠正两个比特的错误。 |
错误纠正能力 | 无错误纠正能力。 | 根据CRC码的长度和算法设计,可以纠正一定数量的错误。 | 可以纠正单个比特的错误。 |
开销 | 仅需添加一个校验位,开销最小。 | 需要添加固定长度的CRC码,开销适中。 | 需要添加多个校验位,开销相对较大。 |
实现复杂度 | 最简单,只需进行简单的位运算。 | 中等复杂度,需要选择合适的CRC多项式和实现除法操作。 | 相对较高,需要设计合适的校验位位置和计算校验位的值。 |
应用场景 | 常用于简单的数据传输和存储系统,对错误检测和纠正要求不高的场合。 | 广泛应用于网络通信、数据存储等领域,用于确保数据的完整性。 | 适用于对错误检测和纠正有较高要求的应用,如内存错误检测。 |
笔记到这里就结束啦,你学会了么😮
评论
匿名评论隐私政策