海明碼(Hamming Code)是一個能夠有多個校驗位,具備檢測並糾正一位錯誤代碼的糾錯碼,因此它也僅用於信道特性比較好的環境中,如以太局域網中,由於若是信道特性很差的狀況下,出現的錯誤一般不是一位。測試
海明碼的檢錯、糾錯基本思想是將有效信息按某種規律分紅若干組,每組安排一個校驗位進行奇偶性測試,而後產生多位檢測信息,並從中得出具體的出錯位置,最後經過對錯誤位取反(也是原來是1就變成0,原來是0就變成1)來將其糾正。編碼
要採用海明碼糾錯,須要按如下步驟來進行:計算校驗位數→肯定校驗碼位置→肯定校驗碼→實現校驗和糾錯。下面來具體介紹這幾個步驟。本文先介紹除最後一個步驟的其它幾個步驟。spa
要使用海明碼糾錯,首先就要肯定發送的數據所須要要的校驗碼(也就是「海明碼」)位數(也稱「校驗碼長度」)。它是這樣的規定的:假設用N表示添加了校驗碼位後整個信息的二進制位數,用K表明其中有效信息位數,r表示添加的校驗碼位,它們之間的關係應知足:N=K+r≤2r-1。blog
如K=5,則要求2r-r≥5+1=6,根據計算能夠得知r的最小值爲4,也就是要校驗5位信息碼,則要插入4位校驗碼。若是信息碼是8位,則要求2r-r≥8+1=9,根據計算能夠得知r的最小值也爲4。根據經驗總結,得出信息碼和校驗碼位數之間的關係如表5-1所示。ci
表5-1 信息碼位數與校驗碼位數之間的關係get
信息碼位數io |
1table |
2~4二進制 |
5~11方法 |
12~26 |
27~57 |
58~120 |
121~247 |
校驗碼位數 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
上一步咱們肯定了對應信息中要插入的校驗碼位數,但這還不夠,由於這些校驗碼不是直接附加在信息碼的前面、後面或中間的,而是分開插入到不一樣的位置。但不用擔憂,校驗碼的位置很容易肯定的,那就是校驗碼必須是在2n次方位置,如第一、二、四、八、1六、32,……位(對應20、21、22、23、24、25,……,是從最左邊的位數起的),這樣一來就知道了信息碼的分佈位置,也就是非2n次方位置,如第三、五、六、七、九、十、十一、十二、13,……位(是從最左邊的位數起的)。
舉一個例子,假設現有一個8位信息碼,即b一、b二、b三、b四、b五、b六、b七、b8,由表5-1得知,它須要插入4位校驗碼,即p一、p二、p三、p4,也就是整個通過編碼後的數據碼(稱之爲「碼字」)共有12位。根據以上介紹的校驗碼位置分佈規則能夠得出,這12位編碼後的數據就是p一、p二、b一、p三、b二、b三、b四、p四、b五、b六、b七、b8。
現假設原來的8位信息碼爲10011101,因如今尚未求出各位校驗碼值,如今這些校驗碼位都用「?」表示,最終的碼字爲:??1?001?1101。
通過前面的兩步,咱們已經肯定了所需的校驗碼位數和這些校驗碼的插入位置,但這還不夠,還得肯定各個校驗碼值。這些校驗碼的值不是隨意的,每一個校驗位的值表明了代碼字中部分數據位的奇偶性(最終要根據是採用奇校驗,仍是偶校驗來肯定),其所在位置決定了要校驗的比特位序列。總的原則是:第i位校驗碼從當前位開始,每次連續校驗i(這裏是數值i,不是第i位,下同)位後再跳過i位,而後再連續校驗i位,再跳過i位,以此類推。最後根據所採用的是奇校驗,仍是偶校驗便可得出第i位校驗碼的值。
1)計算方法
校驗碼的具體計算方法以下:
p1(第1個校驗位,也是整個碼字的第1位)的校驗規則是:從當前位數起,校驗1位,而後跳過1位,再校驗1位,再跳過1位,……。這樣就可得出p1校驗碼位能夠校驗的碼字位包括:第1位(也就是p1自己)、第3位、第5位、第7位、第9位、第11位、第13位、第15位,……。而後根據所採用的是奇校驗,仍是偶校驗,最終能夠肯定該校驗位的值。
p2(第2個校驗位,也是整個碼字的第2位)的校驗規則是:從當前位數起,連續校驗2位,而後跳過2位,再連續校驗2位,再跳過2位,……。這樣就可得出p2校驗碼位能夠校驗的碼字位包括:第2位(也就是p2自己)、第3位,第6位、第7位,第10位、第11位,第14位、第15位,……。一樣根據所採用的是奇校驗,仍是偶校驗,最終能夠肯定該校驗位的值。
p3(第3個校驗位,也是整個碼字的第4位)的校驗規則是:從當前位數起,連續校驗4位,而後跳過4位,再連續校驗4位,再跳過4位,……。這樣就可得出p4校驗碼位能夠校驗的碼字位包括:第4位(也就是p4自己)、第5位、第6位、第7位,第12位、第13位、第14位、第15位,第20位、第21位、第22位、第23位,……。一樣根據所採用的是奇校驗,仍是偶校驗,最終能夠肯定該校驗位的值。
p4(第4個校驗位,也是整個碼字的第8位)的校驗規則是:從當前位數起,連續校驗8位,而後跳過8位,再連續校驗8位,再跳過8位,……。這樣就可得出p4校驗碼位能夠校驗的碼字位包括:第8位(也就是p4自己)、第9位、第10位、第11位、第12位、第13位、第14位、第15位,第24位、第25位、第26位、第27位、第28位、第29位、第30位、第31位,……。一樣根據所採用的是奇校驗,仍是偶校驗,最終能夠肯定該校驗位的值。
……
咱們把以上這些校驗碼所校驗的位分紅對應的組,它們在接收端的校驗結果(經過對各校驗位進行邏輯「異或運算」得出)對應表示爲G一、G二、G三、G4,……,正常狀況下均爲0。
2)校驗碼計算示例
一樣舉上面的例子來講明,碼字爲??1?001?1101。
先求第1個「?」(也就是p1,第1位)的值,由於整個碼字長度爲12(包括信息碼長和校驗碼長),因此能夠得出本示例中p1校驗碼校驗的位數是一、三、五、七、九、11共6位。這6位中除了第1位(也就是p1位)不能肯定外,其他5位的值都是已知的,分別爲:一、0、一、一、0。現假設採用的是偶校驗(也就是要求整個被校驗的位中的「1」的個數爲偶數),從已知的5位碼值可知,已有3個「1」,因此此時p1位校驗碼的值必須爲「1」,得出p1=1。
再求第2個「?」(也就是p2,第2位)的值,根據以上規則能夠很快得出本示例中p2校驗碼校驗的位數是二、三、六、七、十、11,也是一共6位。這6位中除了第2位(也就是p2位)不能肯定外,其他5位的值都是已知的,分別爲:一、0、一、一、0。現假設採用的是偶校驗,從已知的5位碼值可知,也已有3個「1」,因此此時p2位校驗碼的值必須爲「1」,得出p2=1。
再求第3個「?」(也就是p3,第4位)的值,根據以上規則能夠很快得出本示例中p3校驗碼校驗的位數是四、五、六、七、12,一共5位。這5位中除了第4位(也就是p3位)不能肯定外,其他4位的值都是已知的,分別爲:0、0、一、1。現假設採用的是偶校驗,從已知的4位碼值可知,也已有2個「1」,因此此時p2位校驗碼的值必須爲「0」,得出p3=0。
最後求第4個「?」(也就是p4,第8位)的值,根據以上規則能夠很快得出本示例中p4校驗碼校驗的位數是八、九、十、十一、12(原本是能夠連續校驗8位的,但本示例的碼字後面的長度沒有這麼多位,因此只校驗到第12位止),也是一共5位。這5位中除了第8位(也就是p4位)不能肯定外,其他4位的值都是已知的,分別爲:一、一、0、1。現假設採用的是偶校驗,從已知的4位碼值可知,已有3個「1」,因此此時p2位校驗碼的值必須爲「1」,得出p4=1。
最後就能夠得出整個碼字的各個二進制值碼字爲:111000111101(帶陰影的4位就是校驗碼)。