你看得懂的海明碼校驗和糾錯原理(一)

2021-08-02 17:49:57 字數 3754 閱讀 1026

以下內容摘自筆者最新出版的著作《深入理解計算機網路》一書:

本書原始目錄參見此文:

海明碼(hamming code)是乙個可以有多個校驗位,具有檢測並糾正一位錯誤**的糾錯碼,所以它也僅用於通道特性比較好的環境中,如以太區域網中,因為如果通道特性不好的情況下,出現的錯誤通常不是一位。

海明碼的檢錯、糾錯基本思想是將有效資訊按某種規律分成若干組,每組安排乙個校驗位進行奇偶性測試,然後產生多位檢測資訊,並從中得出具體的出錯位置,最後通過對錯誤位取反(也是原來是1就變成0,原來是0就變成1)來將其糾正。

要採用海明碼糾錯,需要按以下步驟來進行:計算校驗位數→確定校驗碼位置→確定校驗碼→實現校驗和糾錯。下面來具體介紹這幾個步驟。本文先介紹除最後乙個步驟的其它幾個步驟。

1.    計算校驗位數

要使用海明碼糾錯,首先就要確定傳送的資料所需要要的校驗碼(也就是「海明碼」)位數(也稱「校驗碼長度」)。它是這樣的規定的:假設用

n表示新增了校驗碼位後整個資訊的二進位制位數,用

k代表其中有效資訊位數,

r表示新增的校驗碼位,它們之間的關係應滿足:

n=k+

r≤2r-1

。如k=5,則要求

2r-r≥5+1=6

,根據計算可以得知

r的最小值為

4,也就是要校驗

5位資訊碼,則要插入

4位校驗碼。如果資訊碼是

8位,則要求

2r-r≥8+1=9

,根據計算可以得知

r的最小值也為

4。根據經驗總結,得出資訊碼和校驗碼位數之間的關係如表

5-1所示。

表5-1   資訊碼位數與校驗碼位數之間的關係

資訊碼位數 1

2~45~11

12~26

27~57

58~120

121~247

校驗碼位數 2

3 45 6

7 82.確定校驗碼位置

上一步我們確定了對應資訊中要插入的校驗碼位數,但這還不夠,因為這些校驗碼不是直接附加在資訊碼的前面、後面或中間的,而是分開插入到不同的位置。但不用擔心,校驗碼的位置很容易確定的,那就是校驗碼必須是在2n次方位置,如第1、2、4、8、16、32,……位(對應20、21、22、23、24、25,……,是從最左邊的位數起的),這樣一來就知道了資訊碼的分布位置,也就是非2n次方位置,如第3、5、6、7、9、10、11、12、13,……位(是從最左邊的位數起的)。

舉乙個例子,假設現有乙個8位資訊碼,即b1、b2、b3、b4、b5、b6、b7、b8,由表5-1得知,它需要插入4位校驗碼,即p1、p2、p3、p4,也就是整個經過編碼後的資料碼(稱之為「碼字」)共有12位。根據以上介紹的校驗碼位置分布規則可以得出,這12位編碼後的資料就是p1、p2、b1、p3、b2、b3、b4、p4、b5、b6、b7、b8。

現假設原來的8位資訊碼為10011101,因現在還沒有求出各位校驗碼值,現在這些校驗碼位都用「?」表示,最終的碼字為:??10011101

3.    確定校驗碼

經過前面的兩步,我們已經確定了所需的校驗碼位數和這些校驗碼的插入位置,但這還不夠,還得確定各個校驗碼值。這些校驗碼的值不是隨意的,每個校驗位的值代表了**字中部分資料位的奇偶性(最終要根據是採用奇校驗,還是偶校驗來確定),其所在位置決定了要校驗的位元位序列。總的原則是:第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位,……。同樣根據所採用的是奇校驗,還是偶校驗,最終可以確定該校驗位的值。 ……

我們把以上這些校驗碼所校驗的位分成對應的組,它們在接收端的校驗結果(通過對各校驗位進行邏輯「異或運算」得出)對應表示為g1、g2、g3、g4,……,正常情況下均為0。

2)校驗碼計算示例

同樣舉上面的例子來說明,碼字為??10011101

先求第1個「?」(也就是p1,第1位)的值,因為整個碼字長度為12(包括資訊碼長和校驗碼長),所以可以得出本示例中p1校驗碼校驗的位數是1、3、5、7、9、11共6位。這6位中除了第1位(也就是p1位)不能確定外,其餘5位的值都是已知的,分別為:1、0、1、1、0。現假設採用的是偶校驗(也就是要求整個被校驗的位中的「1」的個數為偶數),從已知的5位碼值可知,已有3個「1」,所以此時p1位校驗碼的值必須為「1」,得出p1=1。

再求第2個「?」(也就是p2,第2位)的值,根據以上規則可以很快得出本示例中p2校驗碼校驗的位數是2、3、6、7、10、11,也是一共6位。這6位中除了第2位(也就是p2位)不能確定外,其餘5位的值都是已知的,分別為:1、0、1、1、0。現假設採用的是偶校驗,從已知的5位碼值可知,也已有3個「1」,所以此時p2位校驗碼的值必須為「1」,得出p2=1。

再求第3個「?」(也就是p3,第4位)的值,根據以上規則可以很快得出本示例中p3校驗碼校驗的位數是4、5、6、7、12,一共5位。這5位中除了第4位(也就是p3位)不能確定外,其餘4位的值都是已知的,分別為:0、0、1、1。現假設採用的是偶校驗,從已知的4位碼值可知,也已有2個「1」,所以此時p2位校驗碼的值必須為「0」,得出p3=0。

最後求第4個「?」(也就是p4,第8位)的值,根據以上規則可以很快得出本示例中p4校驗碼校驗的位數是8、9、10、11、12(本來是可以連續校驗8位的,但本示例的碼字後面的長度沒有這麼多位,所以只校驗到第12位止),也是一共5位。這5位中除了第8位(也就是p4位)不能確定外,其餘4位的值都是已知的,分別為:1、1、0、1。現假設採用的是偶校驗,從已知的4位碼值可知,已有3個「1」,所以此時p2位校驗碼的值必須為「1」,得出p4=1。

最後就可以得出整個碼字的各個二進位制值碼字為:111000111101(帶陰影的4位就是校驗碼)。

<未完待續>

你看得懂的海明碼校驗和糾錯原理(二)

4.實現校驗和糾錯 雖然上一步已把各位校驗碼求出來了,但是如何實現檢測出哪一位在傳輸過程中出了差錯呢?海明碼也只能檢測並糾正一位錯誤 它又是如何實現對錯誤的位進行糾正呢?其實最關鍵的原因就是海明碼是乙個多重校驗碼,也就是碼字中的資訊碼位同時被多個校驗碼進行校驗,然後通過這些碼位對不同校驗碼的聯動影響...

你看得懂的海明碼校驗和糾錯原理(二)

接上篇 以下內容摘自筆者最新出版的最新著作 深入理解計算機網路 一書 本書原始目錄 4.實現校驗和糾錯 雖然上一步已把各位校驗碼求出來了,但是如何實現檢測出哪一位在傳輸過程中出了差錯呢?海明碼也只能檢測並糾正一位錯誤 它又是如何實現對錯誤的位進行糾正呢?其實最關鍵的原因就是海明碼是乙個多重校驗碼,也...

你看得懂的海明碼校驗和糾錯原理(二)

接上篇 以下內容摘自筆者即將出版的最新著作 深入理解計算機網路 一書。本書將於12月底出版上市,敬請留意!本書原始目錄 4.實現校驗和糾錯 雖然上一步已把各位校驗碼求出來了,但是如何實現檢測出哪一位在傳輸過程中出了差錯呢?海明碼也只能檢測並糾正一位錯誤 它又是如何實現對錯誤的位進行糾正呢?其實最關鍵...