奇偶校验码是一种通过增加冗余位(即校验位)来检测数据传输或存储过程中是否发生错误的简单而广泛采用的方法。其原理是在原始数据的基础上增加一个校验位,使得整个数据(包括校验位)中1的个数为奇数(奇校验)或偶数(偶校验)。以下是根据这一原理来求解奇偶校验码的具体步骤:
一、确定校验类型
首先,需要明确采用的是奇校验还是偶校验。
- 奇校验:要求整个数据中1的个数为奇数。
- 偶校验:要求整个数据中1的个数为偶数。
二、统计原始数据中1的个数
对于给定的原始数据,需要统计其中1的个数。
三、计算校验位
根据统计的1的个数和所选的校验类型,来确定校验位的值。
- 对于奇校验:
- 如果原始数据中1的个数为奇数,则校验位为0,以保持整个数据中1的个数为奇数。
- 如果原始数据中1的个数为偶数,则校验位为1,以增加一个1来使整个数据中1的个数变为奇数。
- 对于偶校验:
- 如果原始数据中1的个数为偶数,则校验位为0,以保持整个数据中1的个数为偶数。
- 如果原始数据中1的个数为奇数,则校验位为1,以增加一个1来使整个数据中1的个数变为偶数(或者可以理解为,通过增加一个1来“翻转”1的个数的奇偶性)。
四、构建完整的奇偶校验码
将原始数据和计算出的校验位组合在一起,形成完整的奇偶校验码。
五、示例
假设我们有一个原始数据为“1011”,并希望采用奇校验来生成奇偶校验码。
- 统计原始数据中1的个数:原始数据“1011”中有3个1。
- 由于采用奇校验,且原始数据中1的个数为奇数(3个),因此我们需要一个校验位来使整个数据中1的个数仍为奇数。由于已经是奇数,所以校验位可以为0(保持奇数不变)。
- 构建完整的奇偶校验码:将原始数据“1011”和校验位“0”组合在一起,得到奇偶校验码“10110”。
同样地,如果采用偶校验,且原始数据中1的个数为奇数(3个),则校验位应为1,以使整个数据中1的个数变为偶数。因此,偶校验码为“10111”。
通过以上步骤,我们可以根据给定的原始数据和所选的校验类型来求解奇偶校验码。
海明校验,也被称为海明码(Hamming Code),是一种由Richard Hamming于1950年提出的错误检测和纠正码。海明校验码的实现原理是在原始数据位中加入几个校验位,从而形成一个新的码字,这个码字的码距被均匀地拉大。数据的每一个二进制位都被分配在几个不同的校验组中,每个校验组都有一个对应的校验位。当某一位数据出错时,就会引起相关的几个校验位的值发生变化,这不仅可以发现错误,还能指出是哪一位出错,为进一步自动纠错提供了依据。
海明校验码具有检测错误和纠正错误的能力。其编码规则是将海明码的最高位号设为m,最低位号为1,即HmHm-1…H2H1。在海明码中,位号数为2的权值(如1、2、4、8等)的那些位被用作校验位,记作P1、P2、P3等,而其余位则为有效信息位。每个数据位都被分配到r个校验组中,每个校验组由一个校验位和它所校验的数据位组成。校验位的取值通过奇偶校验方式确定,即校验位所代表的数据位中1的个数为奇数(奇校验)或偶数(偶校验)。
海明校验码的检错和纠错过程如下:
- 编码:将要传输的数据按照二进制形式进行编码,并在其中插入校验位,形成海明码。
- 传输:将海明码传输到接收端。
- 译码:在接收端,对接收到的海明码进行译码,即检查每个校验组是否满足奇偶校验要求。
- 检错:如果发现某个校验组不满足奇偶校验要求,则说明有错误发生。
- 纠错:根据出错的校验位和校验组的分配规则,可以确定出错的数据位的位置。然后,将出错的数据位取反(即0变为1,1变为0),以纠正错误。
海明校验码具有简单、高效的特点,在计算机通信和存储系统中得到广泛应用。它可以有效地检测和纠正单个位错误,提高数据传输的可靠性。然而,需要注意的是,海明校验码只能检测和纠正单个位错误,对于多个位同时出错的情况则无法处理。因此,在实际应用中,需要根据具体需求选择合适的错误检测和纠正方法。
2 ) 如何分组
为了区分信息位和校验位, 我们用D1D4来表示这4个信息位,然后用P1P3来表示这三个校验位,用H1~H7来分别对应最终的这7位海明码
那这些信息位和校验位应该放到什么位置呢?
一个很容易想到的办法是把这三个校验位放到头部的位置,然后把4个信息位放到尾部的位置
但是海明码不能这么做,有一些特殊的规定,在海明校验码中规定所有的校验位P i P_iP
i
应该分别放在2 i − 1 2^{i - 1}2
i−1
这些位置上
也就是说P1P2P3,这几个校验位,应该分别把他们放到: 第1、2、4这几个位置,那如果还有一个校验位P4的话,那显然应该放到第8的位置
规律是:和我们二进制的权值的上升关系是相符合的, 比如:1、2、4、8、16
所以我们可以把这些校验位所放的位置, 看作是这个校验位它所对应的某一种权值
总之, P1放到第1个位置,然后P2放到第2个位置,P3要放到第4个位置,剩下位置存放其他的信息位, 如下表所示
H7 H6 H5 H4 H3 H2 H1
D4 D3 D2 P3 D1 P2 P1
1 0 1 0
目前为止我们已经确定了,基于上述的例子,我们需要添加三个校验位
或者换一个角度来说,需要把这些信息被分为三个分组,每个分组分别进行偶校验
因此接下来我们应该确定一种规则,就是三个分组当中应该分别包含哪几个信息位
当我们确定了如何分组之后,那么与这个分组相对应的偶校验位的值就很好确定了
来看一下怎么做,需要把这些信息为他所处的位置的序号用二进制的形式表示
比如,对于D1这个信息来说,它所处的位置是3, 那么3的二进制表示应该是011, 每个二进制位的权重是1、2、4(从低到高),011的值就是2+1=3
而下一个信息位是D2,它所处的位置是5,那么我们用二进制表示应该是101,此时,4+1=5
而D3所处的位置是6,那么6用二进制表示应该是110,此时,4+2=6
最后是D4,它处于7这个位置,用二进制表示就是111, 此时,4+2+1=7
P1、P2、P3 分别把它放到1、2、4这些位置,我们可以把它理解为某一种权重,那么这些权重和刚才提到的这三位二进制的权重是一一对应的
H3: 3 -> 011
H5: 5 -> 101
H6: 6 -> 110
H7: 7 -> 111
所以P1这个偶校验位,它所处的分组当中应该有哪些信息位呢?我们只需要把末位为1的这几个信息未把它归为P1所属的分组就可以了
也就是如上:H3、H5、H7这几个位置所对应的信息位归为同一个分组,进行偶校验: P 1 = H 3 ⊕ H 5 ⊕ H 7 = D 1 ⊕ D 2 ⊕ D 4 = 0 P_1 = H_3 \oplus H_5 \oplus H_7 = D_1 \oplus D_2 \oplus D_4 = 0P
1
=H
3
⊕H
5
⊕H
7
=D
1
⊕D
2
⊕D
4
=0
只需要把这个组里面的所有信息位进行异或运算,就可以确定我们的P1应该取0还是取1, 这就是P1的一个计算方式
接下来第2个分组,我们应该让它包含H3、H6和H7所对应的这几个信息位, 获得偶校验位:P 2 = H 3 ⊕ H 6 ⊕ H 7 = D 1 ⊕ D 3 ⊕ D 4 = 1 P_2 = H_3 \oplus H_6 \oplus H_7 = D_1 \oplus D_3 \oplus D_4 = 1P
2
=H
3
⊕H
6
⊕H
7
=D
1
⊕D
3
⊕D
4
=1
最后一个分组的确定方法也是一样的:H5、H6、H7, 也就是D2、D3、D4,它们从属于同一个分组,把它们异或可以得到偶校验位的值:P 3 = H 5 ⊕ H 6 ⊕ H 7 = D 2 ⊕ D 3 ⊕ D 4 = 0 P_3 = H_5 \oplus H_6 \oplus H_7 = D_2 \oplus D_3 \oplus D_4 = 0P
3
=H
5
⊕H
6
⊕H
7
=D
2
⊕D
3
⊕D
4
=0, 这时候我们已经全部确定了海明校验码的值
————————————————版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Tyro_java/article/details/127133117''