1.先舉兩個個例子,使用xor除法(請注意當異或結果首位為0時,除數全部變為0)
接下來資料1111後面加上110變成1111110就可以被1001使用異或除法除盡。
所以我們想要傳送二進位制資料只要在資料後面加上(除數字數-1)個0,再用除數進行異或除法就可以得到餘數,這個得到的餘數就是crc
對於除數(如上為1001),我們稱為生成多項式或生成項或poly。
2.生成項
生成項的最高位在每次除法過後,相關餘數結果都會被消掉,所以不重要
生成項的最低位必須為1,這是規定。
生成項寫成多項式(以一種crc32為例):
寫成16進製制(一般不寫最高位1)為0x04c11db7
3、計算方法
crc可以像上面描述的那樣計算,但效率很低。還有一種驅動表法速度較快,如下,
由於異或除法遵循交換律即(a xor b) xor c = a xor (b xor c),所以可以poly先和poly進行異或運算,但要注意移位
例
上圖的正常流程除法和下圖可以得到相同的結果
所以我們為了一次運算移除四位可以根據被除數的前四位讓除數預先進行相互異或運算。由於移除的4位有16種可能,所以除數的異或運算也對應有16種,由此可列出乙個**,以完成一次運算移除四位的操作。
同理,想一次移除8位則**會變成256個表值。crc16和crc32都是一次移除乙個位元組即8位的。
4.crc其他引數 例:
name:名稱
width:crc的bit位數,即生成項位數減1,例crc32中 width就是32
poly:生成項簡寫,忽略了最高位1
init:十六進製制表示,初始化預置值,在運算開始前其用來和待測數進行xor運算
refin:ture表示輸入值最左邊的bit7位是最低位即msb在右邊lsb在左,false表示msb在左lsb在右
refout:true表示輸出的lsb在左msb在右,false相反
xorout: 計算的結果最後經過和xorout值的異或運算再輸出。
check:校驗最後輸出的值和check值是否一致
更多請看文件
CRC演算法詳解(2)
變換到上面的方法後,我們離 table driven 的方法只有一步之遙了,我們知道乙個位元組能表示的正整數範圍是 0 255,步驟 1 中的計算就是針對 reg 的高 byte 位進行的,於是可以被提取出來,預先計算並儲存到乙個有 256 項的表中,於是下面的演算法就出爐了,這個和上面的演算法本質...
crc校驗詳解
crc即迴圈冗餘校驗碼 cyclic redundancy check 1 是資料通訊領域中最常用的一種查錯校驗碼,其特徵是資訊字段和校驗欄位的長度可以任意選定。迴圈冗餘檢查 crc 是一種資料傳輸檢錯功能,對資料進行多項式計算,並將得到的結果附在幀的後面,接收裝置也執行類似的演算法,以保證資料傳輸...
CRC校驗和CRC各種演算法
crc校驗和crc各種演算法 1 簡介 crc即 迴圈冗餘校驗碼 cyclic redundancy check 是資料通訊領域中最常用的一種查錯校驗碼,其特徵是資訊字段和校驗欄位的長度可以任意選定。迴圈冗餘檢查 crc 是一種資料傳輸檢錯功能,對資料進行多項式計算,並將得到的結果附在幀的後面,接收...