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