漢明碼實現原理
漢明碼(hamming code)是廣泛用於記憶體和磁碟糾錯的編碼。漢明碼不僅可以用來檢測轉移資料時發生的錯誤,還可以用來修正錯誤。(要注意的是,漢明碼只能發現和修正一位錯誤,對於兩位或者兩位以上的錯誤無法正確和發現)。
設將要進行檢測的二進位制**為n位,為使其具有糾錯能力,需要再加上k位的檢測位,組成n+k位的**。那麼,新增加的檢測位數k應滿足:
2k−這就是hamming不等式,漢明嗎規定,我們所得到的m位編碼2k(1≥n+
k2^k-1\geq n+k
2k−1≥n
+k
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我們把上述結果反著排列,得到0110,即十進位制的6,根據漢明碼的校驗規則,編碼出錯的地方即在第6位,我們把第6位的0換成1,即可得原來的編碼001101011。2,3,6,7進行異或,得到1
4,5,6,7進行異或,得到1
8,9進行異或,得到0
漢明碼的編碼和校驗的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 ...