常用的校验码


计算机系统运行时,为了确保数据在传送过程中正确无误,一是提高硬件电路的可靠性,二是提高代码的校验能力,包括查错和纠错。通常使用校验码的方式来检测传送的数据是否出错。

其基本思想是吧数据可能出现的编码分为两类:合法编码和错误编码。合法编码用于传送数据,错误编码是不允许在数据中出现的编码;合理地设计错误编码以及编码规则,使得数据在传送中出现某种错误时会变成错误编码,这样就可以检测出接收到的数据是否有错。

码距:指一个编码系统中任意任意两个合法编码之间至少有多少个二进制位不同。例如,4位8421码的码距为1,在传输过程中,该代码的以为或多位发生错误,都将变成另外一个合法的编码,因此这种代码无检错能力。

PS:为什么说4位8421码的码距为1?

解答:
	码距的定义:编码系统中任意,任意两个合法编码之间至少有多少个二进制位不同,注意任意两个
	8421编码的所有合法编码为:
			0			0000
			1			0001
			2			0010
			3			0011
			4			0100
			5			0101
			6			0110
			7			0111
			8			1000
			9			1001
			10			1010
			11			1011
			12			1100
			13			1101
			14			1110
			15			1111
	任意两个,00000001只有1位二进制位不同,所以8421码的码距为1

一、奇偶校验码

奇偶校验是一种简单有效的校验方法。这种方法通过在编码中增加一位校验位来使编码中1的个数为奇数(奇校验)或者为偶数(偶校验),从而使码距变为2。
在这里插入图片描述

校验位只有一位,要么是0,要么是1。并且它的校验码可以放在码流的前面,也可以放在码流的后面
在这里插入图片描述
在这里插入图片描述

对于奇校验,它可以检测代码中奇数位出错的编码,但不能发现偶数位出错的情况,即当合法编码中的奇数位发送了错误时(编码中的1变成0或者0变成1),则该编码中1的个数的奇偶性就发生了变化,从而可以发现错误。

常用的奇偶校验码有3种:水平奇偶校验码、垂直奇偶校验码和水平垂直校验码;


二、海明码

海明码是一种利用奇偶性来检错和纠错的校验方法。海明码的构成方法是在数据位之间的特定位置上插入k个校验位,通过扩大码距来实现检错和纠错。

设数据位是n位,校验位是k位,则n和k必须满足以下关系:
在这里插入图片描述
海明码的编码规则如下
设k个校验位为PkPk-1,…,P1,n个数据位为Dn-1Dn-2,…,D1D0,对应的海明码为Hn+kHn+k-1,…,H1,那么

  • Pi在海明码的第2i-1位置,即Hj=Pi,且j=2i-1,数据位则依序从低到高占据海明码中剩下的位置;
  • 海明码中的任何一位都是有若干个校验位来检验的。其对应关系如下:
  • 被检验的海明码的下标等于所有参与校验该位的校验位的下标之和,而校验位由自身校验;

对于8位的数据位,进行海明码校验需要4个校验位(23-1=7,24-1=15>8+4)。
令数据位为:D7,D6,D5,D4,D3,D2,D1,D0
令校验位为:P4,P3,P2,P1
形成的海明码为:H12,H11,H10,H9,…,H3,H2,H1,
(1)确定D和P在海明码中的位置
请添加图片描述
(2)确定校验关系

海明码海明码的下标校验位组
H1(P1)1P1
H2(P2)2P2
H3(D0)3=1+2P1,P2
H4(P3)4P3
H5(D1)5=1+4P1,P3
H6(D2)6=2+4P2,P3
H7(D3)7=1+2+4P1,P2,P3
H8(P4)8P4
H9(D4)9=1+8P1,P4
H10(D5)10=2+8P2,P4
H11(D6)11=1+2+8P1,P2,P4
H12(D7)12=4+8P3,P4

偶校验
P1校验:校验组中出现P1的(P1、D0、D1、D3、D4、D6
即P1=D0⊕D1⊕D3⊕D4⊕D6
P2=D0⊕D2⊕D3⊕D5⊕D6
P3=D1⊕D2⊕D3⊕D7
P4=D4⊕D5⊕D6⊕D7
奇校验
将各校验位的偶校验值取反即可
(3)检测错误
G1 = P1⊕D0⊕D1⊕D3⊕D4⊕D6
G2 = P2⊕D0⊕D2⊕D3⊕D5⊕D6
G3 = P3⊕D1⊕D2⊕D3⊕D7
G4 = P4⊕D4⊕D5⊕D6⊕D7
当采用偶校验,则G4G3G2G1全为0时表示接收到的数据无错误(奇校验应全为1)
当G4G3G2G1不全为0时说明发生了错误,而且G4G3G2G1的十进制指出了发生错误的位置,例如:
G4G3G2G1=1010,说明H10(D5)出错了,将其取反即可纠正错误

在这里插入图片描述


三、循环冗余校验码

循环冗余校验码(Cyclic Redundancy Check, CRC)广泛应用于数据通信领域和磁介质存储系统中。它利用生成多项式weik个数据位产生r个校验位来进行编码,其编码长度为k+r,CRC的代码格式为:
在这里插入图片描述
由此可知,循环冗余校验码是由两部分组成的,左边为信息码(数据),右边为校验码。若信息码占k为,则校验码就占n-k位。其中,n为CRC码的字长,所以又称为(n,k)码。校验码是由信息码产生的,校验码位数越多,该代码的校验能力就越强。在求CRC编码时,采用的是模2运算。模2加减运算的规则是按位运算,不发生借位和进位。

校验码的作用是通过在原始数据中添加冗余信息(如校验位),来检测或纠正数据在传输或存储过程中可能发生的错误。其核心原理是利用编码规则构造“合法编码”,当数据因噪声等原因发生改变时,会变成“非法编码”,从而被系统识别出错。 关键概念“码距”(即汉明距离)指的是任意两个合法编码之间二进制位不同的最小数量。码距越大,检错和纠错能力越强。例如: - 码距为1:无法发现任何错误; - 码距为2:可检测单个位错误(如奇偶校验); - 码距为3:可检测两位错误,能纠正一位错误(如海明码)。 常用校验码类型包括: 1. **奇偶校验码** - 原理:增加一个校验位,使整个编码中“1”的个数为奇数(奇校验)或偶数(偶校验)。 - 能力:仅能检测奇数位错误,不能检测偶数位错误,也无法纠正错误。 - 类型: - 水平奇偶校验:对每行数据单独加校验位; - 垂直奇偶校验:对各数据列进行校验; - 水平垂直校验:结合两者,提升检错能力。 2. **海明码(Hamming Code)** - 提出者:Richard Hamming - 目标:实现单比特错误的检测与纠正(SEC, Single Error Correction) - 校验位数量要求:满足不等式 $ 2^k \geq n + k + 1 $,其中 $ n $ 是数据位数,$ k $ 是校验位数。 - 编码结构:将校验位插入到特定位置(通常是 $ 2^i $ 的位置,如第1、2、4、8…位),其余为数据位。 - 工作机制:每个校验位负责检查一组数据位(由二进制位权决定),接收端通过重新计算校验值比较,得到“错误综合征”(syndrome),定位错误位纠正。 - 应用场景:内存(ECC内存)、卫星通信等需要高可靠性的系统。 这些校验码在实际应用中根据性能需求选择: - 奇偶校验适用于低成本、低复杂度场景(如串口通信); - 海明码用于需要自动纠错的关键系统(如RAM、嵌入式控制器); - 更高级的校验码如CRC、Reed-Solomon则用于更强的多错误检测与纠正(如磁盘阵列、无线通信)。 ```python # 示例:简单偶校验生成函数 def even_parity(data: str) -> str: """为二进制字符串添加偶校验位""" count_ones = data.count('1') parity_bit = '0' if count_ones % 2 == 0 else '1' return data + parity_bit # 示例使用 original_data = "1011" coded_data = even_parity(original_data) print(f"原始数据: {original_data}, 添加偶校验后: {coded_data}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝勒里恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值