最近對於資料傳輸的噪音損耗問題的解決方案查了些資料
就此做乙個總結:
資料損壞
因為網線被老鼠啃了或者硬碟摔地上了導致資料錯了
錯誤校驗
即檢驗某一段資料是否有誤。
因為是不是有誤光憑資料本身不可能知道,所以必須加上附加的認證方法
當然最簡單的認證方法就是再傳一次資料,拿著資料乙個個對著原本的資料對照一下。。。不過這樣不說太麻煩,如果要實現這個方法,第二次傳輸這個資料的時候,難以保證這個資料是不是也出現了錯誤
另一方面,顯然資料越短,這段資料出現錯誤的概率越小,因為位元出錯概率(ber)是不變的。所以如果可以把這個認證的資料(校驗碼)壓縮成一段很短的資料就可以減少校驗碼出錯的情況了
比如奇偶校驗(parity check) 或者說,數1校驗
奇偶校驗制定了乙個協議,規定資料中1的個數只能是偶數
如果原始資料1是奇數,則加乙個1在最前面;反之則加乙個0在前面。
如0110101 和11010010 都是符合規定的。 很顯然這個第一位就是校驗碼。
那麼如果資料出了錯誤,某個0變成1或者1變成0,那麼接收者數一遍1發現不是偶數個,那麼就證明資料錯了
當然奇偶校驗的缺陷十分明顯,如果同時錯了2個或者偶數個位,那麼錯誤將無法被檢測出來。。。
所以我們需要更強的校驗演算法,使校驗碼盡可能簡單的同時,讓失誤率盡可能小。
具體實現方法就是加上hash演算法,乙個資料對應乙個hash值,再用hash值代表原有資料的特徵,作為校驗碼,從而達到一一對應的目的。
例如把一段資料乘以10086再對23333取模,將這個hash結果作為校驗碼加在資料後面,然後接收者再做一遍hash得到他的hash值。
如果兩者相同,可以看做兩組資料特徵符合,於是資料得到驗證。
(本質上奇偶校驗也是一種hash)
當然另一方面,既然是hash那麼就不可避免地會出現錯誤,比如資料出錯了,然而接收者得到的hash值正好和校驗碼一樣,或者說資料和校驗碼都錯了然而也正好吻合。所以這要求hash函式足夠強大。
不過要指出的是,如果不幸校驗碼出錯的話,只能重發乙個資料報過來。。
現今使用的md5演算法就是一種通過hash實現的校驗演算法,目前廣泛運用於機密檔案校驗以及銀行系統交易資料等等。
類似的還有廣泛使用的crc迴圈冗餘校驗演算法,被使用於tcp/ip協議中。
另外lrc、bcc、sha等等演算法也可用於錯誤校驗,只是hash函式大同小異,本質上差不多(吧)。還有個nand ecc演算法,沒太看懂。。。
錯誤糾偏
即糾正某一段資料的錯誤。
目前看到可以糾正錯誤的有以下幾種演算法:
後向糾錯:通過錯誤校驗(資料不吻合校驗碼)知道資料錯了以後,要求重新發一遍資料。包括資料錯了和校驗碼錯了兩種情況(這也能叫演算法??)(硬就是能了)
前向糾錯(fec演算法):傳送端在傳送資料之前,加了一些預處理之後的資料(冗餘資料),以在出現錯誤之後可以反推回去糾正錯誤。
零階冗餘:沒有冗餘,就是發原來的資料
(注:一包資料裡面帶乙個校驗碼,也就是乙個整體)
如果有乙個資料壞了,找到這個資料的編號以後,通過其他好的資料將方程反推回去,可以反推回去這個資料。
二階冗餘:在n包資料後面加兩個冗餘資料………………
可以承受乙個資料塊中有兩個資料壞了的情況(模擬一下解方程組,兩個未知數兩個方程)
三階冗餘:…………
一般到了三階冗餘就已經可以保證很強的魯棒性了
漢明碼(hamming code):不多bb貼鏈結,這位大神已經講得很清楚了
缺點是只能承受乙個錯誤的情況
優點……除此之外都是優點,目前見到的唯一做到錯誤校驗和錯誤糾偏的演算法了
關於資料校驗
1.什麼是資料校驗 通俗的說,就是為保證資料的完整性,用一種指定的演算法對原始資料計算出的乙個校驗值。接收方用同樣的演算法計算一次校驗值,如果和隨資料提供的校驗值一樣,就說明資料是完整的。2.最簡單的檢驗 實現方法 最簡單的校驗就是把原始資料和待比較資料直接進行比較,看是否完全一樣這種方法是最安全最...
關於資料的校驗
在一般的程式設計中,通常是將資料的校驗分成兩個部分實現,乙個是資料格式的校驗,另外就是資料邏輯的校驗,或者是資料業務邏輯校驗 目前我能想到的校驗,只有這兩個部分 資料格式的校驗,是在表示層處理,如果是struts用validate.xml校驗就可以。做邏輯校驗的地方很多都不一樣,我看有在action...
海明校驗碼理解 糾錯原理
二 海明校驗碼如何糾錯 雖然上一步已把各位校驗碼求出來了,但是如何實現檢測出哪一位在傳輸過程中出了差錯呢?海明碼也只能檢測並糾正一位錯誤 它又是如何實現對錯誤的位進行糾正呢?其實最關鍵的原因就是海明碼是乙個多重校驗碼,也就是碼字中的資訊碼位同時被多個校驗碼進行校驗,然後通過這些碼位對不同校驗碼的聯動...