[問題] CRC CCITT的問題

作者: a1781781781 (嘎了給給)   2020-01-15 09:46:54
各位先進好
最近在學CRC 使用的多項式是CCITT
有在網路上找到演算法
https://i.imgur.com/5PpCksg.jpg
但我不太理解紅框處在做什麼事情
感謝先進解答
作者: Lipraxde (Lipraxde)   2020-01-15 09:56:00
^ = xor, << = 位元左移
作者: a1781781781 (嘎了給給)   2020-01-15 10:29:00
運算我懂,我不懂的是在對資料做怎樣的處理,把新的位元組加到舊的CRC再去算新的CRC?
作者: Lipraxde (Lipraxde)   2020-01-15 10:31:00
應該吧,我也不是很懂 CRC
作者: sarafciel (Cattuz)   2020-01-15 19:47:00
16bit CRC是一次除2byte 但是他這邊一次只有讀1byte所以他這邊用了點小技巧,以0xABCD為例,他這邊做的事相當於把0xABCD拆成0xAB00^0x00CD ,然後把^0x00CD這件事移到你做八次除法後再做,因為XOR可結合可交換,這樣子跟你把0xABCD直接做8次除法是一樣的,同理可證,第三個byte如果是0xEF,那就是做完16次後補進來,結果就等同於0xABCDEF做16次除法。
作者: a1781781781 (嘎了給給)   2020-01-15 20:40:00
了解!太感謝了!
作者: Lipraxde (Lipraxde)   2020-01-15 21:05:00
恩...那他為什麼不一口氣多讀點呢,想好久XD
作者: sarafciel (Cattuz)   2020-01-15 21:13:00
我猜啦 一次做兩byte的話 len是奇數時應該要多一個判斷一個一個讀就不會有這個問題 code會簡潔一些XD不過一次多挖幾個進來應該會比較快(?) 這個就看需求
作者: Lipraxde (Lipraxde)   2020-01-15 21:40:00
我是想說反正他都用 int,一次讀 4bytes 就可以直接用的小於 0 做 MSB 的判斷,前後多處理一下 ptr 對齊跟 count
作者: LPH66 (-6.2598534e+18f)   2020-01-15 23:07:00
MSB 判斷要另外做, 因為這裡判斷的是有無進位出去也就是事實上判斷的是比 MSB 再出去一個 bit
作者: Lipraxde (Lipraxde)   2020-01-16 10:54:00
判斷完才移出去吧?

Links booklink

Contact Us: admin [ a t ] ucptt.com