漢明碼實現原理
漢明碼(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位。
我們把上述結果反著排列,得到1000,即十進位制的8,根據漢明碼的校驗規則,編碼出錯的地方即在第8位,我們把第8位的0換成1,即可得原來的編碼001101011。1,3,5,7,9進行異或,得到0
2,3,6,7進行異或,得到0
4,5,6,7進行異或,得到0
8,9進行異或,得到1
上述的例子是出現在2^k的校驗位上的,如果出現在非2^k位上,得到的結果也是一樣的,比如:
假設收到的編碼為001100011,即第6位出了錯誤,我們根據規則
我們把上述結果反著排列,得到0110,即十進位制的6,根據漢明碼的校驗規則,編碼出錯的地方即在第6位,我們把第6位的0換成1,即可得原來的編碼001101011。1,3,5,7,9進行異或,得到0
2,3,6,7進行異或,得到1
4,5,6,7進行異或,得到1
8,9進行異或,得到0
漢明碼的編碼和校驗的c++實現
通過原理,我們可以很簡單地實現漢明碼的編碼和校驗**
編碼:
auto cal(size_t sz)->decltype(auto)returnk;}
bool encode(conststring &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;
}
測試樣例:
intmain()
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 ...