【软考】校验码之海明码

1. 说明
  • 1.海明码(Hamming Code)是由贝尔实验室的 Richard Hamming 设计的,是一种利用奇偶性检错纠错的校验方法。
  • 2.海明码的构成方法是在数据位之间的特定位置上插入k个校验位,通过扩大码距来实现检错和纠错。
  • 3.设数据位是n位,校验位是k位,则n和必须满足以下关系:2k-1≥n+k,减一是因为1个校验信息用来指出错误。
2. 编码规则
  • 1.设4个校验位P4P3P2P1,8个数据位D7D6D5D4D3D2D1D0,则对应的海明码为H12H11H10H9H8H7H6H5H4H3H2H1
  • 2.P1在海明码的第20位置上,P2在海明码的第21位置上,P3在海明码的第22位置上,P4在海明码的第23位置上,即Hj=Pi,j=2i-1
  • 3.数据位则依序从低到高占据海明码中剩下的位置。
  • 4.海明码中的任何一位都是由若干个校验位来校验的。
  • 5.被校验的海明码位的下标等于所有参与校验该位的校验位的下标之和。
  • 6.校验位由自身校验。
3. 编码过程
  • 1.例如8位的数据位,进行海明校验需要4个校验位,因为24-1=15>(8+4),减1是因为留一个数判断整体是否有错误。
  • 2.假如数据位为D7D6D5D4D3D2D1D0,校验位为P4P3P2P1,形成的海明码为H12H11H10H9H8H7H6H5H4H3H2H1
  • 3.按照8,4,2,1位放校验位,即H8H4H2H1放校验位P4P3P2P1,得到序列为:D7D6D5D4 P4 D3 D2 D1 P3 D0 P2 P1
  • 4.数据位 D7 的位置为12,分解为8+4,即数据位D7由校验位 P4 P3 校验。
  • 5.数据位 D6 的位置为11,分解为8+2+1,即数据位D6由校验位 P4 P2 P1 校验。
  • 6.数据位 D5 的位置为10,分解为8+2,即数据位D5由校验位 P4 P2 校验。
  • 7.数据位 D4 的位置为9,分解为8+1,即数据位D4由校验位 P4 P1 校验。
  • 8.数据位 D3 的位置为7,分解为4+2+1,即数据位D3由校验位 P3 P2 P1 校验。
  • 9.数据位 D2 的位置为6,分解为4+2,即数据位D2由校验位 P3 P2 校验。
  • 10.数据位 D1 的位置为5,分解为4+1,即数据位D1由校验位 P3 P1 校验。
  • 11.数据位 D0 的位置为3,分解为2+1,即数据位D0由校验位 P2 P1 校验。
  • 12.校验位 P4 的位置为8,即校验位P4由校验位 P4 校验。
  • 13.校验位 P3 的位置为4,即校验位P3由校验位 P3 校验。
  • 14.校验位 P2 的位置为2,即校验位P2由校验位 P2 校验。
  • 15.校验位 P1 的位置为1,即校验位P1由校验位 P1 校验。
  • 16.P1校验P1、D0、D1、D3、D4、D6,使得P1=D0⊕D1⊕D3⊕D4⊕D6
  • 17.⊕表示异或,同为假,异为真,即1⊕0=1,1⊕1=0,0⊕0=0。
  • 18.P2校验P2、D0、D2、D3、D5、D6,使得P2=D0⊕D2⊕D3⊕D5⊕D6
  • 19.P3校验P3、D1、D2、D3、D7,使得P3=D1⊕D2⊕D3⊕D7
  • 20.P4校验P4、D4、D5、D6、D7,使得P4=D4⊕D5⊕D6⊕D7
4. 举个例子
  • 1.数据为0 1 1 0 1 0 0 1,试采用4个校验位求其偶校验方式的海明码。
  • 2.数据位从D7D6D5D4D3D2D1D0依次为0 1 1 0 1 0 0 1。
  • 3.校验位P1=D0⊕D1⊕D3⊕D4⊕D6=1⊕0⊕1⊕0⊕1=1。
  • 4.校验位P2=D0⊕D2⊕D3⊕D5⊕D6=1⊕0⊕1⊕1⊕1=0。
  • 5.校验位P3=D1⊕D2⊕D3⊕D7=0⊕0⊕1⊕0=1。
  • 6.校验位P4=D4⊕D5⊕D6⊕D7=0⊕1⊕1⊕0=0。
  • 7.即偶校验方式海明码H12H11H10H9H8H7H6H5H4H3H2H1 D7D6D5D4 P4 D3 D2 D1 P3 D0 P2 P1
    即:0 1 1 0 0 1 0 0 1 1 0 1。
5. 检测错误
  • 1.G1=P1⊕D0⊕D1⊕D3⊕D4⊕D6
  • 2.G2=P2⊕D0⊕D2⊕D3⊕D5⊕D6
  • 3.G3=P3⊕D1⊕D2⊕D3⊕D7
  • 4.G4=P4⊕D4⊕D5⊕D6⊕D7
  • 5.若采用偶校验,则G4G3G2G1全为0时表示接收到的数据无错误。
  • 5.若采用奇校验,则G4G3G2G1全为1时表示接收到的数据无错误。
  • 6.若采用偶校验,当G4G3G2G1不全为0时说明发生了差错,G4G3G2G1的十进制值指出了发生错误的位置,例如G4G3G2G1=1010,十进制为8+2=10,说明H10即D5出错了,将其取反即可纠正错误。
### 校验码的作用与生成方式 #### 1. 校验码的作用 校验码的主要作用是对数据传输过程中的错误进行检测。通过增加额外的校验位,能够判断接收的数据是否存在单比特错误或其他特定类型的错误。具体来说: - **奇偶校验码**用于检测单一比特错误,无法纠正错误[^1]。 - 如果一个编系统的原始距为1,则通过添加一位奇偶校验码可以使距变为2,从而提高其检错能力[^2]。 #### 2. 奇偶校验码的生成方式 奇偶校验码分为两种形式:奇校验和偶校验。以下是它们的具体生成规则: - **奇校验**:计算有效信息位中“1”的总个数。如果总数已经是奇数,则校验位设为0;如果是偶数,则校验位设为1,使得整个校验码中“1”的数量保持为奇数[^1]。 - **偶校验**:同样统计有效信息位中“1”的总个数。如果总数是偶数,则校验位设为0;若是奇数,则校验位设为1,从而使整个校验码中“1”的数量成为偶数[^2]。 下面是一个简单的 Python 实现示例来生成奇偶校验码: ```python def generate_parity(data, parity_type='odd'): ones_count = sum([int(bit) for bit in data]) if parity_type.lower() == 'odd': return '1' if ones_count % 2 == 0 else '0' elif parity_type.lower() == 'even': return '0' if ones_count % 2 == 0 else '1' # 示例 data_bits = "1011" parity_bit_odd = generate_parity(data_bits, 'odd') # 输出 '0' parity_bit_even = generate_parity(data_bits, 'even') # 输出 '1' print(f"Odd Parity Bit: {parity_bit_odd}, Even Parity Bit: {parity_bit_even}") ``` #### 3. 校验码的特点及其生成方式 校验码是一种更高级别的校验机制,不仅能够检测多位错误,还具备一定的纠错功能。它通过对多个奇偶校验组的设计实现这一目标。具体的生成流程如下: - 首先,在有效信息位之间插入一定数量的校验位,这些校验位的位置通常是 $2^n$ (n=0,1,2,...)的形式[^3]。 - 将每一位分配至不同的奇偶校验组中,并分别计算各组的奇偶性。 - 若某一位置发生错误,会引起对应校验组的变化,进而定位并修正该错误。 由于涉及复杂的分组逻辑,这里提供一段伪代描述如何构建明码: ```plaintext function hamming_encode(data): n = length of data r = calculate number of redundant bits (r >= log(n+r+1)) total_length = n + r initialize encoded_data with zeros of size total_length place data bits into positions not powers of two compute each redundancy bit using appropriate parity check groups return encoded_data ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王佑辉

老板,赏点吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值