汉明码、海明校验码(Hamming Code)
基础知识
码距:又叫海明距离,是在信息编码中,两个编码之间对应位上编码不同的位数。例如编码100110和010101,第1、2、5、6位都不相同,所以这两个编码的码距就是4,并且可以通过异或的方式求出(异或后计算零的个数)
奇偶校验(Parity Check):一种校验代码传输正确性的方法,分为奇校验和偶校验两种方式,目的都是在一字节(8位二进制数)后面加上一个校验位(0或1),奇校验下前面8位和校验码的1的个数应为奇数个,偶校验为偶数个。公式表示为:
\[奇校验:G=\overline{C\oplus X_1\oplus X_2\oplus X_3\oplus ... \oplus X_n}\\
偶校验:G=C\oplus X_1\oplus X_2\oplus X_3\oplus ... \oplus X_n\\
G等于0表示数据正常,否则表示出错
\]在实际中奇偶校验的选择是事先选择的。
奇偶校验的特点
- 编码检错简单
- 编码效率高
- 不能检测偶数位错误,无错结论不可靠,是一种错误检测码
- 也没法识别错误,更不能纠正错误,出错只能重新传
汉明码/海明校验码
海明码的构成方法是在数据位之间的确定位置上插入k个校验位,通过扩大码距来实现检错和纠错。
汉明码跟其它的错误校验码类似,也利用了奇偶校验位的概念。不过与奇偶校验码不同的是,它并不是指定长度字节后面加一位,而是通过计算关系:
\]
计算出指定数据位对应的校验位长度。其中n为数据位,k为校验位长度。
计算
设数据位是8位,那么通过式子\(2^4-1=15>8+4=12\),则校验位为4位
设信息位为:D7,D6,D5,D4,D3,D2,D1,D0,校验位P3,P2,P1,P0,先计算校验位在总共12位的海明码中占据的位数:
- \(P0=2^0=1\)
- \(P1=2^1=2\)
- \(P2=2^2=4\)
- \(P3=2^3=8\)
所以校验位P3,P2,P1,P0分别占据第8、4、2、1位,而信息码从左到右占据剩下的位数,如表:
位数 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
信息位 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | ||||
校验位 | P3 | P2 | P1 | P0 |
注:这个表很多资料中其实是左右倒过来的,如果是倒过来的话就不用最后在倒置了
而信息位与校验位的关系为:信息位的位数=位数相加等于信息位位数的校验位组。例如D7的位数为12,所以D7的校验位组为P3和P2。
信息位 | 信息位检验计算 | 校验位组 |
---|---|---|
D7 | 12=8+4 | P3,P2 |
D6 | 11=8+2+1 | P3,P1,P0 |
D5 | 10=8+2 | P3,P1 |
D4 | 9=8+1 | P3,P0 |
D3 | 7=4+2+1 | P2,P1,P0 |
D2 | 6=4+2 | P2,P1 |
D1 | 5=4+1 | P2,P0 |
D0 | 3=2+1 | P1,P0 |
所以,P0参与了D0,D1,D3,D4,D6的检验,其他由此类推:
\(P0=D0\oplus D1\oplus D3\oplus D4\oplus D6\)
\(P1=D0\oplus D2\oplus D3\oplus D5\oplus D6\)
\(P2=D1\oplus D2\oplus D3\oplus D7\)
\(P3=D4\oplus D5\oplus D6\oplus D7\)
注意:海明码是由高位到低位进行排序(高位先放,低位后方),所以得到的海明码是:P0 P1 D0 P2 D1 D2 D3 P3 D4 D5 D6 D7
而校验的方式则是算出信息的校验码,然后与得到的校验码对应,相同标0,不同标1(让01串异或成原来的样子),得到错误的位置为\(P3^*P2^*P1^*P0^*\)(\(Pn^*\)是标记)
python代码实现校验(这代码摸了快三天,代码水平还是得提高)
# -*- coding: utf-8 -*-
"""
Created on Fri Dec 3 21:59:38 2021
海明码解码纠错(默认只有一个错误)
@author: 01am
"""
#返回将列表里面的元素全部异或的值
def xor1(lista):
j=lista[0]
for i in range(1,len(lista)):
j=j^lista[i]
return j
a = input("请输入海明码:")
len_a = len(a)
k=0
#确定k的值
for i in range(1,len_a):
tmp = pow(2,i)
if tmp > len_a :
k=i
break
#循环创建校验位变量和校验位对应的数据位列表
for i in range(k):
exec('P'+str(i)+'='+str(a[pow(2,i)-1]))
exec('D'+str(i)+'=[]')
#循环创建数据位变量并确定是否与校验位有关
for i in range(len_a):
#如果按照位数的二进制情况下查找1只有1个的情况下,那么一定是校验位
if bin(i+1).count('1')==1:#加一是为了解决range从0开始而海明码从1开始的矛盾
continue
else:
tmp1=bin(i+1)[-1:1:-1]#将二进制数翻转并且去掉0b,方便后面循环寻找相关的校验位
for j in range(len(tmp1)):
if tmp1[j]=='1' :#这里无需加一,因为校验位是从0开始的
exec('D'+str(j)+'.append('+str(a[i])+')')
#新计算的纠错位和原校验位对比后的标志不准确
#判断校验位和计算出来的校验位是否一致
K=''
for i in range(k):
exec('tmp2 = D'+str(i)) #这里的问题,不能写成tmp2 = exec('D'+str(i)),这样会让tmp2成为NoneType
exec('tmp3 = P'+str(i))
tmp4 = xor1(tmp2) #这里可能会提示有变量未定义,不用理
if tmp4 == tmp3 : #这里可能会提示有变量未定义,不用理
K+='0'
else:
K+='1'
tmp5 = K[::-1]#校验位的位置,如果全为零就不存在
#判断校验码是否存在,存在就把对应的位置修改
a=list(a)
if tmp5.find('1')!=-1:
int1 = int(tmp5,2)-1
a[int1]=str(int(a[int1])^1)
print("已经自动纠错一位\n")
#输出不带校验码的字符串
b=''
c=[pow(2,i) for i in range(k)]
for i in range(len_a):
if i+1 not in c:
b+=a[i]
a=''.join(a)
print(a)
print(b)
参考:
汉明码、海明校验码(Hamming Code)的更多相关文章
- 常用校验码(奇偶校验码、海明校验码、CRC校验码)
一.奇偶校验码 二.海明校验码 三.CRC校验码 计算机系统运行时,各个部之间要进行数据交换.交换的过程中,会有发生误码的可能(即0变成1或1变成0),由于计算机的储存是通过二进制代码来实现的的, ...
- 校验码(海明校验,CRC冗余校验,奇偶校验)
循环冗余校验码 CRC码利用生成多项式为k个数据位产生r个校验位进行编码,其编码长度为n=k+r所以又称 (n,k)码. CRC码广泛应用于数据通信领域和磁介质存储系统中. CRC理论非常复杂,一般书 ...
- 常用校验码(奇偶校验,海明校验,CRC)学习总结
常用校验码(奇偶校验,海明校验,CRC)学习总结 一.为什么要有校验码? 因为在数据存取和传送的过程中,由于元器件或者噪音的干扰等原因会出现错误,这个时候我们就需要采取相应的措施,发现并纠正错误,对于 ...
- 汉明码(Hamming Code)原理及实现
汉明码实现原理 汉明码(Hamming Code)是广泛用于内存和磁盘纠错的编码.汉明码不仅可以用来检测转移数据时发生的错误,还可以用来修正错误.(要注意的是,汉明码只能发现和修正一位错误,对于两位或 ...
- Hamming校验码
可参考:http://winda.blog.51cto.com/55153/1068000 Hamming校验码作用:用于校验通信数据,防止出现错误,并具有一定的纠错功能. 汉明码在传输的消息流中插入 ...
- 汉明码(hamming code)
hamming code用于磁盘RAID 2中, 关于汉明码的讲解可以看这篇博文,介绍的很详细.最重要是最后的结论: 汉明码属于分组奇偶校验,P4P2P1=000,说明接收方生成的校验位和收到的校验位 ...
- 海明码 CRC冗余校验码
海明码(也叫汉明码)具有一位纠错能力.本文以1010110这个二进制数为例解释海明码的编码和校验方法 确定校验码的位数x 设数据有n位,校验码有x位.则校验码一共有2x种取值方式.其中需要一种取值方式 ...
- Atitit 常用二维码对比(QR、PDF417、DM、汉信码 Aztec code maxicode
Atitit 常用二维码对比(QR.PDF417.DM.汉信码 Aztec code maxicode DM码则更"小",可在仅仅25mm²的面积上编码30个数字.但也就是因为太小 ...
- PHP CRC16 校验码的算法怎么使用
PHP CRC16 校验码的算法如何使用最近用到CRC16, 我现在就是要把 010301180001 算出CRC16的校验码,通过其他工具,可以得到 校验码是 05F1 最后完整的代码就是 0103 ...
随机推荐
- JZOJ5405 & AtCoder Grand Contest 001 F. Permutation
题目大意 给出一个长度为\(n\)的排列\(P\)与一个正整数\(k\). 你需要进行如下操作任意次, 使得排列\(P\)的字典序尽量小. 对于两个满足\(|i-j|>=k\) 且\(|P_i- ...
- centos6.5 搭建zabbix3.0
一.搭建LAMP平台 注意zabbix3.0需要php5.4以上的版本 (1)安装依赖包 httpd和mysql安装过程省略 rpm -e httpd --nodeps yum -y install ...
- CSS基础 margin塌陷问题以及解决 办法
场景:两个相互嵌套的块级元素,父子元素相互紧贴margin-top会合并作用在父元素的子元素结果:导致两个盒子同时移动 解决方法: 1.给父元素设置overflow:hidden 2.给父元素设置浮动 ...
- mybatis-plus实现多表联查
一.方法一 1.在pojo模块下新建一个VO 包路径用于提供页面展示所需的数据 2.在vo包下新建EmployInfo类,此类继承了Employees类,再把Dept类的数据复制过来 3.在Dao层中 ...
- Shell中 heredoc 内容转义
1.在$符号前面加反斜杠,如: cat > test.sh <<EOF \$test EOF 如果不加,将转成实际的值. 2.给EOF加个双引号,如: cat > test.s ...
- Linux上天之路(十)之Linux磁盘管理
主要内容 磁盘介绍 磁盘管理 磁盘限额 逻辑卷管理 磁盘阵列 1. 磁盘介绍 硬盘最基本的组成部分是由坚硬金属材料制成的涂以磁性介质的盘片,不同容量硬盘的盘片数不等.每个盘片有两面,都可记录信息.盘片 ...
- CentOS6.5-Hadoop2.7.3安装hive-2.1.1
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6627723801960382979/ 系统版本,Hadoop已安装完成 Mysql安装完成 准备的解压包 安装zi ...
- vue iview element-ui兼容IE11浏览器
首先安装babel-polyfill npm install babel-polyfill --save-dev 入口文件引用,在main.js中引用 import 'babel-polyfill' ...
- POJ2891Strange Way to Express Integers
http://poj.org/problem?id=2891 实际上就是一个一元线性同余方程组.按照合并的方式来解即可. 有一个注意点,调用函数是会慢的. #include<iostream&g ...
- 常用Cron表达式范例
描述 表达式 每隔5秒执行一次 */5 * * * * ? 每隔1分钟执行一次 0 */1 * * * ? 每天23点执行一次 0 0 23 * * ? 每天凌晨1点执行一次 0 0 1 * * ? ...