常用校验码(奇偶校验码、海明校验码、CRC校验码)
计算机系统运行时,各个部之间要进行数据交换.交换的过程中,会有发生误码的可能(即0变成1或1变成0),由于计算机的储存是通过二进制代码来实现的的,误码会导致储存的内容发生改变。为确保数据在传送过程正确无误,常使用检验码. 我们常使用的检验码有三种. 分别是奇偶校验码、海明校验码和循环冗余校验码(CRC) 。
一、奇偶校验码
学习资料:常用校验码
概念:
奇偶校验码是奇校验码和偶校验码的统称. 它们都是通过在要校验的编码上加一位校验位组成.
校验方法:
如果是奇校验加上校验位后,编码中1的个数为奇数个。如果是偶校验加上校验位后,编码中1的个数为偶数个。
分类:
- 水平奇偶校验码:对每一个数据的编码添加校验位,使信息位与校验位处于同一行
例子:
| 原编码 | 奇校验 | 偶校验 |
|---|---|---|
| 0000 | 0000 1 | 0000 0 |
| 0010 | 0010 0 | 0010 1 |
| 1100 | 1100 1 | 1100 0 |
| 1010 | 1010 1 | 1010 0 |
当原编码在传输、储存的过程中发生了误码,1的数量就会改变,然后就能校验出该过程出现了错误。
- 垂直奇偶校验码:把数据分成若干组,一组数据排成一行,再加一行校验码. 针对每一行列采用奇校验 或 偶校验

缺点:
- 只能检测出奇数位出错. 如果发生偶数位错误就无法检测
设原编码为0000,传输的过程中变成了1001。如果使用奇校验,原编码是00001,传输过后会变成10011,1仍然是奇数个,无法校验;如果使用偶校验,原编码是00000,传输过后会变成10010,1仍然是偶数个,同样无法校验。
- 奇偶校验码无法检测出哪位出错.所以属于无法矫正错误的校验码。
校验过程中只知道1的数量发生变化,对于哪个地方发生变化无从知道。
二、海明校验码
学习资料:海明校验码
实现原理:
它的实现原理,是在m个数据位之外加上k个校验位,从而形成一个m+k位的新的码字,使新的码字的码距比较均匀地拉大。把数据的每一个二进制位分配在几个不同的偶校验位的组合中,当某一位出错后,就会引起相关的几个校验位的值发生变化,这不但可以发现出错,还能指出是哪一位出错,为进一步自动纠错提供了依据。
两个码组对应位上数字的不同位的个数称为码组的距离,简称码距
例:
| 1 | 0 | 1 | 0 | 1 |
|---|
| 0 | 0 | 0 | 0 | 1 |
|---|
这两个二进制码中,有三个不相同的位置,所以码距为3.
须知:
- 海明校验码是放在2的幂次位上的,即“1,2,4,8,16,32······”;
- 信息位为m的原始数据,需要加入k位的校验码,它满足m+k+1<2^k;
例子:
要计算原始信息位为101101100的海明校验码。
先用m+k+1<2^k计算出校验位:9+k+1 <2^k→k=4,即校验位为4位。
因为海明校验码是放在2的幂次位上,所以插在位置1,2,4,8中


用到的校验码是看 当前位置由哪几个 校验码所在的位置的和
- 例如
校验码的位置是1,2,4,8。位置3= 1 + 2,所以位置3用到的校验码是1和2;位置7 = 1 + 2 + 4组成的,所以位置7用到的校验码是1,2和4。
然后将校验码校验的位置记录下来:
- 校验码1(位置1):3,5,7,9,11,13
- 校验码2(位置2):3,6,7,10,11
- 校验码3(位置4):5,6,7,12,13
- 校验码4(位置8):9,10,11,12,13
注意:后面的数字串是位置的下标,不是值,值还是0或1。
然后做异或运算(相同时为0,不同时为1)
- 校验码1(位置1):1 xor 0 xor 1 xor 0 xor 1 xor 0 = 1
- 校验码2(位置2):1 xor 1 xor 1 xor 1 xor 1 = 1
- 校验码3(位置4):0 xor 1 xor 1 xor 0 xor 0 = 0
- 校验码4(位置8):0 xor 1 xor 1 xor 0 xor 0 = 0

三、循环冗余校验码(CRC校验)
学习资料:CRC的校验原理以及例子
原理:CRC检验原理实际上就是在一个p位二进制数据序列之后附加一个r位二进制检验码(序列),从而构成一个总长为n=p+r位的二进制序列;附加在数据序列之后的这个检验码与数据序列的内容之间存在着某种特定的关系。如果因干扰等原因使数据序列中的某一位或某些位发生错误,这种特定关系就会被破坏。
实现步骤:
双方事先约定了一个R次多项式g(x),即CRC码
CRC码的特点:
- 位数要少于原编码
- 收尾为1
- 自行决定
例:
原编码:1001001011
则CRC码可以为10011,也可以为11001等
但是:10010这种不可以,因为它的尾巴不是1,1001101011也不行,因为它的位数与原编码的一致。
要注意的是:CRC码并非是校验码,但需要通过CRC码来获得校验码。具体校验码的话要先让原编码加上CRC码位数个0(即CRC码有的多少位,就要加上多少位0在原编码的后面)然后用新原编码除CRC码,得到的余数就是校验码
例:
原编码=1010001101
CRC码设为:110101
校验码有5位,因此
新原编码:101000110100000
然后用新原编码除以CRC码:

校验码就是01110
校验方法
用原编码与校验码进行模2减法,获得最终原编码。此时最终原编码除以CRC码是可以整除的,由于接收方也有相同的CRC码,在数据传输的过程中不发生错误,接收方用接收到的数据除以CRC码也是可以整除的,此时为无错误。同时,不能整除,说明传输过程中数据发生了错误。
常用校验码(奇偶校验码、海明校验码、CRC校验码)的更多相关文章
- [技术栈]CRC校验原理及C#代码实现CRC16、CRC32计算FCS校验码
1.CRC.FCS是什么 CRC,全称Cyclic Redundancy Check,中文名称为循环冗余校验,是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检 ...
- Modbus协议 CRC 校验码
CRC(循环冗余校验)在线计算 http://www.ip33.com/crc.html 里面的8005的多项式值,但网上看到的算法都是用A001来异或的 ---------------------- ...
- CEIWEI CheckSum CRC校验精灵v2.1 CRC3/CRC4/CRC5/CRC6/CRC8CRC10/CRC11/CRC16/CRC24/CRC32/CRC40/CRC64/CRC82/Adler32
CEIWEI CheckSum CRC校验精灵 是一款通用的循环冗余校验码CRC(Cyclic Redundancy Check).MD5.SHA1.SHA2.SHA3.HAVAL.SHAKE.TIG ...
- C# CRC校验的一点感悟
今天在鼓捣一个手持操作器的时候,遇到一点问题,记录一下今天的经验包 由于之前公司产品在校验时基本上都是和校验,今天在准备用C#模拟一个古董操作器的时候,却遇到一个问题,模拟器发出的数据,主板一律不回复 ...
- CRC校验源码分析
这两天做项目,需要用到 CRC 校验.以前没搞过这东东,以为挺简单的.结果看看别人提供的汇编源程序,居然看不懂.花了两天时间研究了一下 CRC 校验,希望我写的这点东西能够帮助和我有同样困惑的朋友节省 ...
- CRC校验码原理、实例、手动计算
目录一.CRC16实现代码二.CRC32编码字符表三.CRC校验码的手动计算示例四.CRC校验原理五.CRC的生成多项式参考 一.CRC16实现代码 思路:取一个字符(8bit),逐位检查该字符,如果 ...
- CRC校验码
循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码.对于一个给定的(N,K)码,可以证明存在一个最高次幂为R的多项式G(x)(R ...
- Modbus RTU CRC校验码计算方法
在CRC计算时只用8个数据位,起始位及停止位,如有奇偶校验位也包括奇偶校验位,都不参与CRC计算. CRC计算方法是: 1. 加载一值为0XFFFF的16位寄存器,此寄存器为CRC寄存器. 2. ...
- CRC(Cyclic Redundancy Check)循环冗余校验码与海明码的计算题
(17)采用CRC进行差错校验,生成多项式为G(X)=X4+X+1,信息码字为10111,则计算出的CRC校验码是 (17) .A.0000 B.0100 C.0010 D.1100试题 ...
随机推荐
- 团队作业7——第二次项目冲刺(Beta版本)day3
项目成员: 曾海明(组长):201421122036 于波(组员):201421122058 蓝朝浩(组员):201421122048 王珏 (组员):201421122057 叶赐红(组员):20 ...
- css图片替换方法
图片替换主要是指将文字替换成图片的技术,即在html语句中使用文字,浏览器显示时用对应的图片显示.其意义在于便于做网站优化(SEO),因为文字才是搜索引擎寻找的主要对象. https://www.cn ...
- Python3中遇到UnicodeEncodeError: 'ascii' codec can't encode characters in ordinal not in range(128)
在 linux服务器上运行代码报错: Python3中遇到UnicodeEncodeError: ‘ascii’ codec can’t encode characters in ordinal no ...
- NOIP模板总结
NOIP模板总结 进考场先打一份缺省源: # include <cstdio> # include <iostream> # include <cstring> # ...
- 矩阵dp
矩阵dp 这里是矩阵dp,不是矩阵乘法优化dp. 矩阵上的dp好像也没什么特殊的?大概有一个套路就是从上向下,从左向右进行dp吧. 首先第一道题好像不是矩阵dp... 1005 矩阵取数游戏:http ...
- Thinkphp5.0分页和跳页
后台查询商品或者会员量需要用到分页展示列表,当页数比较多的时候为了体高用户体验度,需要添加一个跳页也就是手动输入页码数进行快速跳转指定页面.由于手动编写分页比较麻烦,又想使用TP5自带的分页,但是TP ...
- str操作方法
s = 'dsj,fhk,je,f' # s1 = s.split(',') # print(s1) s = 'aleX leNb' s1 = s.strip() print(s1) s2 = s[2 ...
- Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP
<?php class Car { var $color = "add"; function Car($color="green") { $this-&g ...
- ap、map值计算
ap:所有图片某一个类 map:所有图片所有类的ap的平均 以一个score为阈值,大于score的所有框是假定正确输出的所有预测,将这些框和gt匹配(iou大于某一个阈值认为匹配成功),得到当前sc ...
- 服务发现系统etcd之安装和使用
一.概述 etcd是一个高可用的键值存储系统,主要用于共享配置和服务发现.etcd是由CoreOS开发并维护的,灵感来自于 ZooKeeper 和 Doozer,它使用Go语言编写,并通过Raft一致 ...