常用校验码(奇偶校验,海明校验,CRC)学习总结

常用校验码(奇偶校验,海明校验,CRC)学习总结

一.为什么要有校验码?

因为在数据存取和传送的过程中,由于元器件或者噪音的干扰等原因会出现错误,这个时候我们就需要采取相应的措施,发现并纠正错误,对于错误的检测和校正,大多采取“冗余校验”的思想,即除原数据外,额外增加若干位编码,这些新增的代码称为校验位。

二.数据是如何校验的?

  • 输入的数据m经过f得到p校验位。
  • 数据m和校验位一起通过存储器或传输线路,分别得到m‘和p‘,这两者可能和m,f相同,也可能由于传输储存发生问题而不同。
  • 由数据m‘再次经过f得到校验位p‘‘,比较p‘‘和p‘,从而得出是否出错,输出对应的信息,如何比较,会在下面的对应校验码中给出。

三.码距

若干位代码组成的一个字称为码字,而两个码字具有不同代码的位数为这两个码字的距离,而码制里各种码字间最小的距离称为码距。

比如8421码,1001和0000,有两位不同,所以距离是2,而0010和0011的距离为1,是最小的距离,故8421码码距为1

那么,码距有什么用呢?答案是码距和这种类型的码的检错,纠错能力有关。

如8421码,由于码距是1,无检错,纠错能力,比如数据0000,如果其中一位变化,变成0001,那么,这个数据仍然是合法的。
再如奇偶校验码中奇校验码,如100000000和010000000,码距为2,我们可以发现,如果数据中有一位变化了,如100000000变为110000000,我们可以很容易地判断出数据出错了,因为110000000不符合奇校验的编码(校验位和数据位一起所含1的个数为奇数)

我们可以发现,校验码可以帮助扩大码距,从而找出错误。

码距与检错、纠错能力的关系(当d≤4)

  • 若码距d为奇数,则能发现d-1位错,或能纠正(d-1)/2位错。
  • 若码距d为偶数,则能发现d/2位错,并能纠正(d/2-1)位错。

四.奇偶校验码

1.编码方式

  • 无论数据位多少位,校验位只有一位
  • 数据位和校验位一共所含的1个数为奇数,称为奇校验
  • 数据位和校验位一共所含的1个数为偶数,称为偶校验

例如(加粗为校验位):

数据 奇校验的编码 偶校验的编码
00000000 100000000 000000000
01010100 001010100 101010100
01111111 001111111 101111111

由于数据传输过程一般是出现一位错误,而奇偶校验码能发现奇数个错误,所以奇偶校验的实用价值还是很高的。

2.实现原理

那么,奇偶校验是怎么来发现错误的呢?根据二.数据是如何校验的我们可以知道,在数据传输之前,我们会求一次校验位,传输后,会求一次校验位,那么,在奇偶校验中,我们通过比较这两个校验位是否相同,一般是采用异或的方式,若结果为1,则说明有奇数个错误,结果为0,则说明正确或者偶数个错误。

五.海明校验码

1.引入

  • 在了解了奇偶校验码之后,我们可以稍稍做下思考,既然奇偶校验码具有一定的局限性,也就是只能检测奇数的错误,并且不能改正错误,这也就意味着数据一旦传输错误,我们必须要重新上传,那么,我们有办法确定错误发生的位置么?只要确定了错误发生的位置,改正其实就是取反。
  • 这个时候,让我们来看看奇偶校验码,它是在数据的前面或者后面加上以为校验位,那么,如果我们将数据分段,分成某些小段,这样是不是能判断错误发生的位置呢?

2.海明校验码 最简单求法

我们以8位数据位,4(5)位校验位为例

我们将海明校验码表示为(H13) H12 H11 H10 H9 H8 H7 H6 H5 H4 H3 H2 H1

其中加粗的部分为校验位,校验位所在位置为2^(i-1),i=1,2,3...

我们还可以把它写成(P5) D8 D7 D6 D5 P4 D4 D3 D2 P3 D1 P2 P1

其中P代表的是校验位,D代表数据位

12 11 10 9 8 7 6 5 4 3 2 1 S
2^0 D7 D5 D4 D2 D1 P1 S1
2^1 D7 D6 D4 D3 D1 P2 S2
2^2 D8 D4 D3 D2 P3 S3
2^3 D8 D7 D6 D5 P4 S4

我们来看看这个表是怎么画出来的

  • 首先数据位和校验位的位置我们通过公式可以得出
  • 同列数据位所占的位置对应的行的值之和为列的值。举个例子,如D1,所在列为3,所在行分别为2^0和2^1,即1和2,满足式子1+2=3。

校验位的值为同行数据位相异或得到,至于P5,则是由所有数据位和校验位一起异或得到。

3.海明校验码判断修复错误

下面引入一个错误字S的概念

其实错误字S也就是传输前后分别求的校验位的异或值,奇偶校验码只要看一个错误字,而海明校验码则要考虑多个错误字。

S4 ~ S1为全0,说明没错. S4 ~ S1不为全0,说明有错. S5=1说明1位出错,而S5=0说明2位错,不再有效,且不能查出是哪2位出错。

S4~S1的编码值对应的则是出错的海明码位号(不太清楚图表可以返回上面的表格对照):

如1100,对应D8出错

如1011,对应D7出错

如1010,对应D6出错

如1001,对应D5出错......

  • Tip:我们通过观察8个数据位4个校验位的海明校验码,发现,若一位出错,则至少有两组校验码的生成收到影响,故我们得到其码距为3,根据码距与检错、纠错能力的关系可以得出该校验码能发现两位错,或修改一位错。

4.校验码位数的确定

前面看完后,一定有人会有疑问,为什么八位数据位我要四位或者五位校验位,三位不行么?六位不行么?那么,请继续看看下面

假定数据位数为n,校验码为k位,则故障字位数也为k位。k位故障字所能表示的状态最多是2K,每种状态可用来说明一种出错情况。

若只有一位错,则结果可能是:

数据中某一位错 (n种可能)

校验码中有一位错 (k种可能)

无错 ( 1 种可能)

假定最多有一位错,则n和k必须满足下列关系:

2^k≥1+n+k, 即:2^k-1≥n+k

所以当数据有8位时,校验码和故障字都应有至少4位。

六.循环冗余码(CRC码)

1.为什么大批量数据不用奇偶校验?

在每个字符后增加一位校验位会增加大量的额外开销;尤其在网络通信中,对传输的二进制比特流没有必要再分解成一个个字符,因而无法采用奇偶校验码。

2.模2运算

在介绍CRC码之前,有必要介绍下计算CRC码必要的模2运算:

模2运算不考虑加法进位和减法借位,上商的原则是当部分余数首位是1时商取1,反之商取0。然后按模2相减原则求得最高位后面几位的余数。这样当被除数逐步除完时,最后的余数位数比除数少一位。这样得到的余数就是校验位。

3.基本思想

  • 数据信息M(x)为一个n位的二进制数据,将M(x)左移k位后,用一个约定的“生成多项式”G(x)相除,G(x)是一个k+1位的二进制数,相除后得到的k位余数就是校验位。校验位拼接到M(x)后,形成一个n+k位的代码,称该代码为循环冗余校验 ( CRC ) 码,也称(n+k,n)码。
  • 一个CRC码一定能被生成多项式整除,当数据和校验位一起送到接受端后,只要将接受到的数据和校验位用同样的生成多项式相除,如果正好除尽,表明没有发生错误;若除不尽,则表明某些数据位发生了错误。通常要求重传一次。

4.CRC码求法

5.CRC码检错

将收到的CRC码用约定的生成多项式G(x)去除,如果码字无误则余数应位0,如果有某一位出错,则余数不为0,不同位数出错余数不同.

原文地址:https://www.cnblogs.com/FZfangzheng/p/8519791.html

时间: 2024-10-27 09:27:01

常用校验码(奇偶校验,海明校验,CRC)学习总结的相关文章

校验码 -> 奇偶校验

何谓奇偶校验? 奇偶校验是一种简单有效的校验方法. 这种方法通过在编码中增加一位校验位来使编码中1的个数为奇数或者偶数 位数是奇数的就叫做奇校验,偶数就叫做偶校验 通过这种方式可以使码距变成2 举例 下例取自wikipedia 原数据(7位) 1的个数 偶校验(8位) 奇校验(8位) 0000000 0 00000000 00000001 1010001 3 10100011 10100010 校验原理 奇偶校验可以通过逐位异或的方式来简化运算 校验成功 A向B发送数据1001 判断1的个数是否

CRC校验码原理、实例、手动计算

CRC16实现代码 思路:取一个字符(8bit),逐位检查该字符,如果为1,crc^crc_mul;同时,如果原本crc最高位是1,那么crc^crc_mul后左移1位,否则只是左移一位.计算完一个字符后,装入下一个字符. #include<stdio.h> #define crc_mul 0x1021 //生成多项式 unsigned int cal_crc(unsigned char *ptr, unsigned char len) { unsigned char i; unsigned

[技术栈]CRC校验原理及C#代码实现CRC16、CRC32计算FCS校验码

1.CRC.FCS是什么 CRC,全称Cyclic Redundancy Check,中文名称为循环冗余校验,是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误.它是利用除法及余数的原理来作错误侦测的. FCS,全称Frame Check Sequence,中文名称为帧校验序列,俗称帧尾,即计算机网络数据链路层的协议数据单元(帧)的尾部字段,是一段4个字节的循环冗余校验码. 注:CRC循环冗余校验和FCS帧校验序列是

信管备考知识点精讲·计算机硬件基础之校验码

信息系统管理工程师是全国计算机技术与软件专业技术资格考试(简称计算机软件资格考试)中的一个中级考试.信息系统管理工程师考试要求考生掌握计算机系统.操作系统.数据库.计算机网络.信息化和信息系统等相关知识内容.信息系统管理工程师考试要求掌握的内容宽且多,备考期间哪些内容是需要重点掌握的呢?下面跟着希赛软考学院来学习信息系统管理工程师计算机硬件基础校验码部分要重点掌握的内容. 信息系统管理工程师备考知识点精讲之校验码 奇偶校验 是一种简单有效的校验方法通过在编码中增加一位校验位来使编码中的1的个数为

【计算机组成原理】校验码

奇偶校验码 组成奇偶校验码的基本方法:在n位有效信息位上增加一个二进制校验位,构成一个n+1位奇偶校验码 奇校验:使n+1位的奇偶校验码中1的个数为奇数 偶校验:使n+1位的奇偶校验码中1的个数为偶数 只能发现无法修改 海明校验码: 多重校验  分成多组 每一组做奇偶校验 可以发现并纠错 原文地址:https://www.cnblogs.com/dream-to-pku/p/11615995.html

身份证号生成,校验码计算

二代身份证号有18位,组成是: 6位地区码+8位出生年月日+3位顺序码+1位校验码 其中,校验码计算如下图,本范例按照红色计算方向走 第一步骤就是映射权重:第二步骤是求积:第三步骤相加求余:最后一个步骤就是查找码表得出最后1位字符 红色方向数字更小,计算更快. import randomimport time   # 地区区域码,此范例只列出3位areas = ('610622', '410901', '321281', '350581')# 身份证前17位权重w17 = (7, 9, 10,

校验之:海明码校验、奇偶校验

1.奇偶校验码 奇偶校验通过在编码中增加一个校验位来使编码中的1的个数为奇数(奇校验)或者偶数(偶校验),从而使码距变为2.对于奇校验,它可以检测代码中奇数位出错的编码,但不能发现偶数位出错的情况.既当合法编码中奇数位出现错误.也就是1变成0或者0变成1,其编码的奇偶性就发生了变化,从而发现错误.但是这种校验只能发现出现了错误但是不知道具体是哪一位发生了错误. 8421码的奇偶校验码    十进制数       8421 BCD码         带奇校验位的8421码        带偶校验位

Redis源码中的CRC校验码(crc16、crc64)原理浅析

在阅读Redis源码的时候,看到了两个文件:crc16.c.crc64.c.下面我抛砖引玉,简析一下原理. CRC即循环冗余校验码,是信息系统中一种常见的检错码.大学课程中的"计算机网络"."计算机组成"等课程中都有提及.我们可能都了解它的数学原理,在试卷上手工计算一个CRC校验码,并不是难事.但是计算机不是人,现实世界中的数学原理需要转化为计算机算法才能实现目的.实际上作为计算机专业背景人并不会经常使用或接触到CRC的计算机算法实现的原理,通常是电子学科背景的人士

计组_海明校验码

原理: 在数据中加入几个校验码,并把数据的每一个二进制位分配在几个奇偶校验组中. 设:校验位的个数为r,能表示2^r个信息,1个表示“没错误”, 2^r -1个指出错误发生在哪一位. k= 2^r –1-r个信息可用于纠正数据位. 2^r≥k+r+1 若要检测并纠正一位错,同时发现两位错,r,k应满足下列关系: 2^r-1≥k+r      (见表3.8) 校验位和数据位是如何排列的 校验位排列在  2^(i–1) (i =0,1,2,…)的位置上 例:有一个编码 为D4D3D2D1,由此生成一