首页 > 编程知识 正文

海明校验码是如何校验的,海明校验码校验位怎么计算出来的

时间:2023-05-05 21:35:57 阅读:138671 作者:2722

【前言】数据在传输过程中,受到脉冲干扰、随机噪声干扰、人为干扰等各种干扰的影响,使数据出现错误。 为了控制传输过程中的错误,通信系统必须采取有效的措施来控制错误的发生。

在数据传输过程中传输的都是0和1,传输时有最小的数据单位。 当a传递给b的一个数据单位时,b在收到数据单位时,会遇到两个问题。 一个是数据单位是否有错误,即是否检测到错误,另一个是如果数据单位错了能否纠正,即是否纠正错误。 因此,为了解决这个问题,不是所有的数据单位都是数据本身,包括其他支持错误检测和纠错的东西在内,这个数据单位被称为校验码。

如果校验码无误,就可以自然地从校验码中取出数据。 在【发送端和接收端事先约定校验码中的哪一位是数据】存在错误且不能进行纠错的情况下,接收端当前接收到的校验码被丢弃,要求发送端重新发送。

【奇偶校验】采用奇偶校验方式的校验码被称为奇偶校验。 假设有n位奇偶校验位,其中奇偶校验位为1位,信息位为n-1位。 在8个比特的示例中,奇偶校验位是1比特并且是最高有效位(也可以是最低有效位),并且剩下的7个比特是信息比特。

为了让校验码中的1的个数成为奇数而进行奇数核对。 偶尔检查,使检查代码中的1的个数为偶数。

信息位为1001101,有四个1。 应该采用奇偶校验,添加1 (即奇偶位为1 ),使校验码的1个数为奇数。 因此,采用奇偶校验时的校验码为11001101。 同样,采用偶然校验时的校验码是01001101。

在信息比特为101 0111的情况下,奇数校验为0101 0111,偶数校验为1101 0111

在信息比特为000 0000的情况下,奇数校验为1000 0000,偶数校验为0000 0000

以奇检查为例。

如果在传输期间检查位的1位发生了更改,则该更改可能位于信息位中,也可能位于奇偶校验位中。 请注意更改是从0变为1,还是从1变为0。 无论改变哪一个,校验码1的个数都会从奇数变成偶数。 接收方检测接收的校验码,若发现1的个数为偶数,则因该数据错误,即有检错能力,但不知道哪个位错了,所以不能纠正错误。

如果校验码有2位更改,则更改后校验码1的个数仍为奇数,此时无法进行错误检测。

对我们来说,是根据公式1的个数来判断校验码是否有误,对计算机来说,是通过异或运算来判断1的个数。 异或运算,如果不同则为1,如果相同则为0。

在奇偶校验的情况下,1的数量是奇数,并且在对校验数字的所有比特进行“异或”运算时,获得的结果必定是1。 相反,成立。

偶校验时,1的个数为偶数,对校验码的所有位进行异或运算时,得到的结果一定为0。 相反,成立。

特点:只能检测奇数个位数改变的出错情况,不能纠错。奇校验不会产生全0校验码。

【海明码】汉明码也称为汉明码,其本质是多重奇偶校验。 假设每一信息比特有n个比特,则将信息比特分为多个组,共有k个奇偶校验比特,每一组进行偶检测。 奇偶校验位的位置位于整个校验码的2的幂的位置,即1、2、4、8、16等位置。 其中,n和k的关系如下。

如果代入各自不同的n,则可对应的k如下。

以信息位1010为例,n=4,对应的k=3,即校验码共有7个位,校验码的第1、2、4个位为奇偶校验位。 这样就得到了校验码的长度和奇偶校验位的位置。 现在的校验码是101吗? 是0吗? 然后请求奇偶校验位的值。 请注意,计算机的低位为右,高位为左。

在计算第一个校验码时,即第一组从当前位开始连续检查一位,跳过一位,然后再连续检查一位,再跳过一位。 也就是说,选择第1、3、5、7位,011? 因为在采用这种4位偶数校验的情况下,1的个数应该是偶数(异或运算结果为0 )?=0。

在计算第二个校验码时,即第二组从当前位开始连续检查两位,跳过两位,然后再连续检查两位,再跳过两位。 也就是说,选择2、3、6、7位。 100? 采用偶检查的情况下?=1。

计算第三个校验码时(即第三组),从当前位开始,连续校验4位,跳过4位后,再连续校验4位,再跳过4位·······也即选择第4、5、6、7位,其为101?采用偶校验时,?=0。

如此,求得了信息位1010的海明码为1010 010

随后要确定这个海明码经过传输后,接收到的数据是否无误,即如何校验海明码。

校验海明码和奇偶校验的方式类似,每组信息中一位是校验位,其他是数据位。

对第一组,通过对第1、3、5、7位进行异或运算,看结果是否为0。如果为0,表明这几位的数据没出错。

对第二组,通过对第2、3、6、7位进行异或运算,看结果是否为0。如果为0,表明这几位的数据没出错。

对第三组,通过对第4、5、6、7位进行异或运算,看结果是否为0。如果为0,表明这几位的数据没出错。

如果所有结果都为0,表明数据无误。如果结果有1,表明有误。也即可以检错。

假设有1位发生了错误,且错误在第6位,则第一组结果为0,第1、3、5、7位没有错误;第二组结果为1,第2或者6位错误;第三组结果为1,第4或者6位错误。可推知,第6位错误。也即有一位的纠错能力。(将三组结果逆序组合,结果为110,表示6,即第6位出错)(再次强调,计算机中高位在左边。)

(可以检错一位的数学证明还不清楚)

假设有2位发生了错误,且错误在第2位和第3位,则第一组结果为1,则第1、3、5、7位中有1位错误;第二组结果为0,没有错误;第三组结果为0,没有错误。因此,可以知道数据有错误,但不知道错误在哪。

特点:具有1位纠错能力和2位检错能力

【循环冗余码校验码CRC】

CRC的基本思想是:在发送端和接收端约定一个除数, 当接收端将校验码进行除法运算后得到的余数为0,则表示校验码无措,否则进行重传或纠错。

校验码包含K个信息位和R个校验位,R为除数的最高次幂,除数通常用一个生成多项式表示,例如生成多项式表示除数为1101,R=3。

假设信息位为101001,则校验码有9位,低三位为校验位,初始值为0,随后用除数进行模2除法获得余数,余数为校验码的值,则校验码为101001 001

假设9位中任意一位发生错误,则都会得到一个确定的余数,当选择合适的生成多项式时,会使得余数各不相同,因此发生错误的位数和余数可以建立一一对应的关系,能进行1位纠错。

CRC是普遍采用的检错方式,其理论上

1)可检测出所有奇数个错误;

2)可检测出所有双比特的错误;

3)可检测出所有小于等于校验位长度的连续错误;

4)以相当大的概率检测出大于校验位长度的连续错误

【参考】

https://baike.baidu.com/item/%E6%95%B0%E6%8D%AE%E6%A0%A1%E9%AA%8C

《计算机组成原理》

https://baike.baidu.com/item/%E5%BE%AA%E7%8E%AF%E5%86%97%E4%BD%99%E7%A0%81

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。