漢明碼編碼原理及校驗(yàn)方法分析
1.奇偶校驗(yàn)
我們約定一串編碼里1的個(gè)數(shù)是偶數(shù)個(gè),那么這串編碼里攜帶的信息就是對(duì)的,否則就是錯(cuò)的。我們可以在開頭對(duì)這串編碼加一位校驗(yàn)碼實(shí)現(xiàn)奇偶校驗(yàn)。
例子:
我們想傳輸10010這串碼,那么在傳輸?shù)臅r(shí)候,就傳010010,其中在開頭的0就是校驗(yàn)位
。
我們想傳輸10000這串碼,那么在傳輸?shù)臅r(shí)候,就傳110000,其中在開頭的1就是校驗(yàn)位
。
兩個(gè)例子的1的個(gè)數(shù)都是偶數(shù)。
2.漢明碼
首先漢明碼是采用奇偶校驗(yàn)的碼。它采用了一種非常巧妙的方式,把這串?dāng)?shù)字分了組,通過分組校驗(yàn)來確定哪一位出現(xiàn)了錯(cuò)誤。并且能對(duì)錯(cuò)誤的位置進(jìn)行改正
注意:
漢明碼默認(rèn)一串?dāng)?shù)據(jù)只錯(cuò)一位
漢明碼怎么分組:
我們看到,其實(shí)有些數(shù)據(jù)是既在P1組又在P2組的。怎么分組,這個(gè)要記住,沒啥原理了哈哈。要預(yù)先做的工作是,把表示位置的這個(gè)數(shù),轉(zhuǎn)化成二進(jìn)制數(shù),也就是:
第1個(gè)位置,變成第0001個(gè)位置;
第2個(gè)位置,變成第0010個(gè)位置;
第3個(gè)位置,變成第0011個(gè)位置;
第4個(gè)位置,變成第0100個(gè)位置;
第5個(gè)位置,變成第0101個(gè)位置;
第6個(gè)位置,變成第0110個(gè)位置;
那么,規(guī)定來了,
凡是位置符合這種形式的,XXX1,歸到P1;
凡是位置符合這種形式的,XX1X,歸到P2;
凡是位置符合這種形式的,X1XX,歸到P3;
凡是位置符合這種形式的,1XXX,歸到P4;
那么顯然各個(gè)校驗(yàn)碼也被分到各個(gè)組里面去了,而且,每個(gè)組只有一個(gè)校驗(yàn)碼。
我舉個(gè)例子:
我們想傳這一組碼:XX1X101X011
一共11位。
標(biāo)X的是校驗(yàn)碼的位置,我們暫時(shí)不知道它的值是多少。
位置在1,3,5,7,9,11的數(shù)據(jù)進(jìn)到P1組。(你轉(zhuǎn)換一下這些位置的二進(jìn)制,就知道他們的位置符合XXX1)
位置在2,3,6,7,10,11的數(shù)據(jù)進(jìn)到P2組。(位置符合XX1X)
位置在4,5,6,7的數(shù)據(jù)進(jìn)到P3組。(位置符合X1XX)
位置在8,9,10,11的數(shù)據(jù)進(jìn)到P4組。(位置符合1XXX)
那么確定了分組,校驗(yàn)碼的值也就順便確定下來了。
這樣整個(gè)串的碼就確定下來了。
校驗(yàn)碼的位置:
這是規(guī)定,記住它,在采用漢明碼的一串?dāng)?shù)據(jù)中,2的i次方的位置上,我們放校驗(yàn)碼。
校驗(yàn)碼是1,或者是0,使得校驗(yàn)碼所在的組的1的個(gè)數(shù)是偶數(shù)。
如圖:
綠色的位置是放校驗(yàn)碼的地方,1,2,4,8,16……等等,2的i次方的地方。
校驗(yàn)碼其實(shí)是每一個(gè)分組特有的,每個(gè)分組特有的也就只有校驗(yàn)碼
從發(fā)送者的角度,我該怎么發(fā)用上漢明碼的數(shù)據(jù)呢:
首先我們考慮我們到底要發(fā)多少位。假設(shè)校驗(yàn)碼一共k位,我們想發(fā)的原始數(shù)據(jù)一共n位,要注意我們的校驗(yàn)碼也要校驗(yàn)校驗(yàn)碼錯(cuò)沒錯(cuò),所以,要校驗(yàn)的一共有k+n位,k位校驗(yàn)碼可以檢測2^k位的碼,但是不能所以,校驗(yàn)碼的位數(shù)要滿足這個(gè)公式
2 k > k + n 2^k>k+n 2k>k+n,或者說 2 k − 1 ≥ k + n 2^{k}-1 \geq k+n 2k−1≥k+n
這樣我們就能算出來要用多少校驗(yàn)碼了。
其實(shí)哈,實(shí)際上不用這么麻煩,教科書總是那么復(fù)雜。假設(shè)你想發(fā)101011111,那你就先占下校驗(yàn)位,然后空著的位填你想發(fā)的數(shù)據(jù)就好。
占下1,2,4,8……等等位,看能占下多少位就可以,當(dāng)然這個(gè)手算比較直觀啦哈。
好,我假設(shè)你填完了,然后分好組,也確定了校驗(yàn)位的值了,那么發(fā)送出去啦~
我是接收者,我收到了一串漢明碼,怎樣用漢明碼的性質(zhì)來檢錯(cuò)呢:
1.分組,分好P1,P2,P3……
2.分別對(duì)每個(gè)組校驗(yàn),沒有錯(cuò)的給它0,有錯(cuò)的給1.
3.記得第一個(gè)問題,漢明碼的原理嗎?你可能會(huì)想,3個(gè)組,我們可以畫3個(gè)圈,可是100個(gè)組,這個(gè)圈可就太難畫了??!
這里有一個(gè)等價(jià)的方法,hamming真的太聰明了。
把P從大到小排列起來,得到一串1010,
for example:
組別: P5 P4 P3 P2 P1
標(biāo)志: 1 0 1 0 1
從大到小排列起來,標(biāo)志排成了一串一零串。這個(gè)數(shù)就是出錯(cuò)的數(shù)據(jù)的位置。
本例中,10101位置上的位錯(cuò)了,換成十進(jìn)制是第21個(gè)位置上的數(shù)錯(cuò)了。
然后,我們發(fā)現(xiàn)了它錯(cuò)誤的位置,又因?yàn)樗嵌M(jìn)制的,不是0就是1,所以,可以順便把它糾錯(cuò)。
以上就是漢明碼編碼原理及校驗(yàn)方法分析的詳細(xì)內(nèi)容,更多關(guān)于漢明碼編碼及校驗(yàn)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
typescript?實(shí)現(xiàn)RabbitMQ死信隊(duì)列和延遲隊(duì)列(訂單10分鐘未付歸還庫存)的過程
RabbitMQ作為一款流行的消息隊(duì)列服務(wù),提供了死信隊(duì)列(Dead?Letter?Exchange)功能,能夠有效地處理消息被拒絕、消息過期以及隊(duì)列達(dá)到最大長度等情況,本文將介紹如何利用RabbitMQ的死信隊(duì)列來處理這三種情況,并提供了TypeScript示例代碼,需要的朋友可以參考下2024-03-03Delphi 本地路徑的創(chuàng)建、清空本地指定文件夾下的文件
這篇文章主要介紹了Delphi 本地路徑的創(chuàng)建、清空本地指定文件夾下的文件,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08滑動(dòng)驗(yàn)證碼的設(shè)計(jì)與理解
這篇文章主要介紹了滑動(dòng)驗(yàn)證碼的設(shè)計(jì)與理解,本文通過實(shí)例代碼給大家介紹小網(wǎng)站是怎么設(shè)計(jì)的,代碼簡單易懂,需要的朋友可以參考下2019-08-08微信支付、支付寶支付等常用第三方支付通道接口手續(xù)費(fèi)對(duì)比
微信支付、支付寶等第三方支付,需要和銀聯(lián)、網(wǎng)聯(lián)對(duì)接,有清算機(jī)構(gòu)和銀行的交易處理通道成本。費(fèi)率指支付手續(xù)費(fèi)的費(fèi)率,不同行業(yè)、不同的支付平臺(tái)、不同的支付額度或次數(shù)所對(duì)應(yīng)的通道費(fèi)率是不一樣的。2023-01-01