我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下计算机中的编码问题,来看第二部分,海明码。
很多初学者一看到海明码就郁闷,因为课本上关于海明码的描述实在是太难懂了。那就跟随我一起来搞懂海明码,我用最简单最好懂的方式描述,我不会使用高深的数学术语,你一定能看懂。
先耐心看完下面这几段,这是理解的基础。假设1帧包含m个数据位(报文数据位)和r个冗余位(校验位),则帧的长度n=m+r。这n位单元通常称为n位码字。
海明码距(码距)是两个码字中不相同的二进制位的个数,两个码字的码距是一个编码系统中任意两个合法编码(码字)之间不同的二进制数的位数,编码系统的雄踞是整个编码系统中任意两个码字的码距的最小值。误码率是传输错误的比特占所传输比特总数的比率。好了,看了这里估计有人已经要放弃了,我们换个通俗易懂的理解。
海明码是一种多重奇偶检错码,具有检错和纠错的功能。海明码的全部码字由原来的信息和附加的奇偶校验位组成。奇偶校验位和信息位赋值在传输码字的特定位置上。这种组合编码方式能找出发生错误的位置,无论是原有信息位,还是附加校验位。
下面我们就正式开始了,我们以发送端发送原始信息101101为例,讲解海明码推导与校验过程。
1。确定海明码校验位长。m是信息位长,101101的m=6。根据m+k+1<=(2的k次方),解不等式得到最小k为4,即校验位为4,信息位加校验的总长度为10位。
2。推导海明码开始。那我们究竟要发送什么样的编码才可以呢,海明码校验位通常被从左至右安排在1(2的0次方)、2(2的1次方)、4(2的2次方)、8(2的3次方)、......的位置上。原始信息则从左至右填入剩下的位置。P1、P2等为检验位编号,B1、B2等为位置编号,如下,看下图时注意上下对齐:
P1 P2 1 P3 0 1 1 P4 0 1
B1 B2 B3 B4 B5 B6 B7 B8 B9 B10
校验位处于B1、B2、B4、B8位,剩下位为信息位,信息位依从左至右的顺序先行填写完毕。
3。计算校验位。把除去1、2、4、8(校验位位置值编号)之外的3、5、6、7、9、10值转换为二进制位,如下:
信息位B3 信息位编号的十进制为3 信息位编号的二进制为0011
信息位B5 信息位编号的十进制为5 信息位编号的二进制为0101
信息位B6 信息位编号的十进制为6 信息位编号的二进制为0110
信息位B7 信息位编号的十进制为7 信息位编号的二进制为0111
信息位B9 信息位编号的十进制为9 信息位编号的二进制为1001
信息位B10 信息位编号的十进制为10 信息位编号的二进制为1010
先把满足条件二进制位最低位(右边第1位)为1的所有Bi进行异或(xor)操作,结果填入P1。然后是右边第2位为1所有进行操作填入P2,依此类推。
依据上述方法得到校验位:
P1=B3 xor B5 xor B7 xor B9=1 xor 0 xor 1 xor 0=0
P2=B3 xor B6 xor B7 xor B10=1 xor 1 xor 1 xor 1=0
P3=B5 xor B6 xor B7=0 xor 1 xor 1 =0
P4=B9 xor B10=0 xor 1 =1
全部填入后得到如下:
0 0 1 0 0 1 1 1 0 1
B1 B2 B3 B4 B5 B6 B7 B8 B9 B10
好了,到这里为止,信息的校验位加好了,发送端就准备要把这个加了校验位的信息发送出去了。当程序执行到发送命令后,这条信息就发送出去了,飞往目的端了。
4。校验。现在目的端收到这条信息了,想看看信息有没有错误,那就要执行校验程序,看看有没有问题,那怎么做呢,我们继续往下看。
将所有信息位位置编号1-10的值转换为二进制位
信息位B1 信息位编号的十进制为1 信息位编号的二进制为0001
信息位B2 信息位编号的十进制为2 信息位编号的二进制为0010
信息位B3 信息位编号的十进制为3 信息位编号的二进制为0011
信息位B4 信息位编号的十进制为4 信息位编号的二进制为0100
信息位B5 信息位编号的十进制为5 信息位编号的二进制为0101
信息位B6 信息位编号的十进制为6 信息位编号的二进制为0110
信息位B7 信息位编号的十进制为7 信息位编号的二进制为0111
信息位B8 信息位编号的十进制为8 信息位编号的二进制为1000
信息位B9 信息位编号的十进制为9 信息位编号的二进制为1001
信息位B10 信息位编号的十进制为10 信息位编号的二进制为1010
然后进行如下操作:
将所有信息编号的二进制的右边第1位为1的Bi进行异或操作,得到X1。将所有信息编号的二进制的右边第2位为1的Bi进行异或操作,得到X2。将所有信息编号的二进制的右边第3位为1的Bi进行异或操作,得到X4。将所有信息编号的二进制的右边第4位为1的Bi进行异或操作,得到X8。
上述过程对应公式描述如下:
X1=B1 xor B3 xor B5 xor B7 xor B9
X2=B2 xor B3 xor B6 xor B7 xor B10
X4=B4 xor B5 xor B6 xor B7
X8=B8 xor B9 xor B10
计算后得到一个形式为X8X4X2X1的二进制,转换为十进制时,结果为0,则未发生比特差错;结果为非0(假设为a),则错误发生在第a位。
好,现在我们把全过程模拟一遍,
假设起始端发送加了上述校验码的信息(原始信息为101101,加上校验码后为0010011101),目的端收到的信息为0010111101(看到没有,目的端收到了错误的信息,从左到右第5位发生的变化,这一位与原信息不同了),如下:
0 0 1 0 1 1 1 1 0 1
B1 B2 B3 B4 B5 B6 B7 B8 B9 B10
依据公式为:
X1=B1 xor B3 xor B5 xor B7 xor B9=0 xor 1 xor 1 xor 1 xor 0=1
X2=B2 xor B3 xor B6 xor B7 xor B10=0 xor 1 xor 1 xor 1 xor 1=0
X4=B4 xor B5 xor B6 xor B7=0 xor 1 xor 1 xor 1=1
X8=B8 xor B9 xor B10=1 xor 0 xor 1=0
则将X8X4X2X1=0101的二进制转换为5。结果非0,则错误发生在第5位。
到这里就全部结束了,大家应该听懂了吧,写这么长不容易,请大家给个好评吧。
作者简介:荔园微风,1981年生,高级工程师,浙大工学硕士,软件工程项目主管,做过程序员、软件设计师、系统架构师,早期的Windows程序员,Visual Studio忠实用户,C/C++使用者,是一位在计算机界学习、拼搏、奋斗了25年的老将,经历了UNIX时代、桌面WIN32时代、Web应用时代、云计算时代、手机安卓时代、大数据时代、ICT时代、AI深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。