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

2021-08-28 10:22:32 字數 2115 閱讀 8784

漢明碼實現原理

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

設將要進行檢測的二進位制**為n位,為使其具有糾錯能力,需要再加上k位的檢測位,組成n+k位的**。那麼,新增加的檢測位數k應滿足:

2k−

1≥n+

k2^k-1\geq n+k

2k−1≥n

+k

這就是hamming不等式,漢明嗎規定,我們所得到的m位編碼2k(

k≥0∣

2k

k)

2^k(k\geq0\mid 2^k2k

(k≥0

∣2kk)

位上插入特殊的校驗碼,其餘位把原始碼按順序放置。

漢明碼的編碼規則如下:

漢明碼編碼例項

以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。

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

假設收到的編碼為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)

return k;

}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)

return k;

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

sum += panti << p;

}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()

else

cout << endl;

}return 0;

}

ECC校驗 漢明碼(Hamming Code)

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

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

漢明碼實現原理 漢明碼 hamming code 是廣泛用於記憶體和磁碟糾錯的編碼。漢明碼不僅可以用來檢測轉移資料時發生的錯誤,還可以用來修正錯誤。要注意的是,漢明碼只能發現和修正一位錯誤,對於兩位或者兩位以上的錯誤無法正確和發現 漢明碼的實現原則是在原來的資料的插入k位資料作為校驗位,把原來的n為...

漢明碼詳細講解

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