漢明碼(Hamming Code)原理及實現

2022-01-22 13:05:53 字數 3595 閱讀 1013

漢明碼實現原理

漢明碼(hamming code)是廣泛用於記憶體和磁碟糾錯的編碼。漢明碼不僅可以用來檢測轉移資料時發生的錯誤,還可以用來修正錯誤。(要注意的是,漢明碼只能發現和修正一位錯誤,對於兩位或者兩位以上的錯誤無法正確和發現)。

漢明碼的實現原則是在原來的資料的插入k位資料作為校驗位,把原來的n為資料變為m(m = n +k)位編碼。其中編碼時要滿足以下原則:

2^k -1>=m 其中(m =n +k)

這就是hamming不等式,漢明碼規定,我們所得到的m位編碼的2^k ( k>=0 && 2^k < m)位上插入特殊的校驗碼,其餘位把原始碼按順序放置。

漢明碼的編碼規則如下:

漢明碼編碼例項

以10101編碼為例,建立乙個漢明碼編碼的空間,並且把原始碼填入編碼的對應位中中,_ _ 1 _ 0 10 _ 1,並留出校驗碼位(校驗位先設為0)。(因為2^4 - 1>= 5+4 && 2^3 - 1 < 5+ 3所以需要4位校驗碼)

漢明碼校驗錯誤例項

我們以上面的編碼為例,假設我們現在收到的編碼為001101001,我們可以發現漢明碼的第8位與原來的漢明碼001101011不同,那我們怎麼找出這個第8位的錯誤編碼呢?

演算法很簡單,我們只要在算漢明碼校驗位的演算法的上再算一遍,就得到了漢明碼的校驗方法,比如計算001101001對應的2^k位。

1,3,5,7,9進行異或,得到0

2,3,6,7進行異或,得到0

4,5,6,7進行異或,得到0

8,9進行異或,得到1

我們把上述結果反著排列,得到1000,即十進位制的8,根據漢明碼的校驗規則,編碼出錯的地方即在第8位,我們把第8位的0換成1,即可得原來的編碼001101011。

上述的例子是出現在2^k的校驗位上的,如果出現在非2^k位上,得到的結果也是一樣的,比如:

假設收到的編碼為001100011,即第6位出了錯誤,我們根據規則

1,3,5,7,9進行異或,得到0

2,3,6,7進行異或,得到1

4,5,6,7進行異或,得到1

8,9進行異或,得到0

我們把上述結果反著排列,得到0110,即十進位制的6,根據漢明碼的校驗規則,編碼出錯的地方即在第6位,我們把第6位的0換成1,即可得原來的編碼001101011。

漢明碼的編碼和校驗的c++實現

通過原理,我們可以很簡單地實現漢明碼的編碼和校驗**

編碼:

auto cal(size_t sz)->decltype(auto)

returnk;}

bool encode(const

string &s, string &d)

else

if (s[j] == '

0' || s[j] == '1'

) d[i] = s[j++];

else

return

false

; }

for (auto i = 0; i != k;i++)

return

true;}

解碼與校驗:

auto antical(size_t sz)->decltype(auto)

returnk;}

auto decode(

string &s, string &d)->decltype(auto)

sum += panti <}

if (sum != 0

) d[sum - 1] = (1- (int)(d[sum - 1] - '

0')) + '0'

;

for (decltype(d.size()) i = 0, p = 0,j = 0; i != d.size(); i++)

return

sum;

}

測試樣例:

int

main()

size_t index;

cout

<< "

----input error index : ";

cin >>index;

auto k =dest.size();

if (index != 0 && index <=dest.size())

dest[index - 1] = (1 - (int)(dest[index - 1] - '

0')) + '0'

; cout

<< "

code

"<< dest

if (ret == 0

)

else

cout

<}

return0;

}10101

source:

10101

dest:

001101011

----input error index : 8

code

001101001

error index

8corret source:

10101

corret dest:

001101011

1001010101010101010111111001101

source:

1001010101010101010111111001101

dest:

1111001101010100101010101111110101101

----input error index : 20

code

1111001101010100101110101111110101101

error index

20corret source:

1001010101010101010111111001101

corret dest:

1111001101010100101010101111110101101

1source:

1dest:

111----input error index : 0

code

111source:

1dest:

111

參考資料:calculating the hamming code

ECC校驗 漢明碼(Hamming Code)

本文主旨意在講清如何根據原理構造常用的漢明碼,鑑於本人在網路查閱資料過程翻閱大量低效 無效文章,特記錄如下內容。前篇主要表明如何簡單直接的構造漢明碼,後續在了解漢明碼具體校驗原理的情況下,將會補錄有關原理的內容。error correcting code ecc 糾錯碼。漢明碼 hamming co...

漢明碼(Hamming Code)原理及實現

漢明碼實現原理 漢明碼 hamming code 是廣泛用於記憶體和磁碟糾錯的編碼。漢明碼不僅可以用來檢測轉移資料時發生的錯誤,還可以用來修正錯誤。要注意的是,漢明碼只能發現和修正一位錯誤,對於兩位或者兩位以上的錯誤無法正確和發現 設將要進行檢測的二進位制 為n位,為使其具有糾錯能力,需要再加上k位...

漢明碼詳細講解

漢明碼,是r.hamming與1940年於貝爾實驗室提出的。1.奇偶校驗碼 奇偶校驗碼。假設傳輸資訊位為k n 1位,表示為a1,an 1,加上一位奇偶校驗位 冗餘位 a0,構成乙個n位的碼字a0 an 1,在接收端校驗時,可按照關係式 s a0 a1 a2 an 1來計算。若s 0,則無錯,若s ...