複習網路,不小心碰到差錯控制的crc冗餘碼計算,隨便算了一下,發現自己算的不對,於是發現了一串知識,總結如下。主要就是crc中用到的模2運算和二進位制/十進位制除法有別,前者是特殊的除法,甚至根本不是除法,就是異或。
看來必然是要增加開銷的,沒有白吃的午餐,難怪名字叫做「冗餘」呢
就是傳送方先把冗餘碼的位置放n個0,然後把整個資料(k+n)位作為乙個數字,除以(用的是模2除法,很重要!!不是常規除法)乙個事先準備好的除數p(n+1位),除下來的餘數r就是n位的,這n位餘數就作為傳送方的crc迴圈冗餘碼。
到了收方,就拿收到的數字除以相同的除數p(大概是協議規定好的p),餘數為0就代表沒出錯
對每一幀都要校驗一下
也不是100%會檢測正確,也有概率檢測的結果不對,冗餘碼的位數越大,結果才能越準確,檢測錯誤的概率才會小
這篇部落格點醒了我
一直看不明白crc冗餘碼的計算過程,,花了乙個多小時研究,之前以為上面的描述是說十進位制除法,自己的例子和ppt的例子都推不通,看了很多網頁,以為是二進位制除法,結果發現二進位制除法本質和十進位制除法是一樣的,得到的結果也是一樣的。。。
後來終於明白了,crc計算中說的除法,根本不是十進位制或者二進位制除法,而是模2除法,這是一種特殊的除法,基本也只在crc冗餘碼的計算中才會用到,別的地方不用。
模2除法的重點是(只要掌握了這幾個點,就可以打通模2除法的經脈了,不再彷徨疑惑):
為何餘數首位是1,則商為是0呢?因為其實商是餘數首位和除數首位的異或,但是除數一直都不變且其首位一定是1啊,所以自然就是餘數首位為1,商就是0咯
可以看到異或運算在it領域是多麼重要可以看到:
收方收到資料後:
餘數是0,所以沒出錯,接收。
二進位制,十進位制,十六進製制計算
一.在計算機應用中,二進位制使用字尾b表示 十進位制使用字尾d表示,十六制使用字尾h表示。二.二進位制,十六進製制與十進位制的計算轉換 1.二進位制轉換為十進位制 計算公式 二進位制資料x位數字乘以2的x 1次方的積的總和 例 10101011b d資料10 1010 11x 1位76 5432 1...
二進位制和十進位制轉換
static final int default initial capacity 1 4 aka 16 檢視hashmap原始碼,發現這個static final int default initial capacity 1 4 值為16。這個是位移演算法。例如 4的二進位制是 0000 0100...
二進位制轉十進位制
二進位制轉十進位制方法很多,如字元陣列,指標法等 下面用字串函式的方法實現 二進位制轉十進位制 主要用 到 string函式性質及pow求乙個數的n次方的函式過載 by adengou 2010.08.04 win7 dev c 5.0 vs 2010 通過 include include incl...