[問題] CRC CCITT的問題

看板C_and_CPP (C/C++)作者 (嘎了給給)時間5年前 (2020/01/15 09:46), 編輯推噓1(1021)
留言22則, 4人參與, 5年前最新討論串1/1
各位先進好 最近在學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

01/15 09:56, 5年前 , 1F
^ = xor, << = 位元左移
01/15 09:56, 1F

01/15 10:29, 5年前 , 2F
運算我懂,我不懂的是在對資料做怎樣的處理,把新的
01/15 10:29, 2F

01/15 10:29, 5年前 , 3F
位元組加到舊的CRC再去算新的CRC?
01/15 10:29, 3F

01/15 10:31, 5年前 , 4F
應該吧,我也不是很懂 CRC
01/15 10:31, 4F

01/15 19:47, 5年前 , 5F
16bit CRC是一次除2byte 但是他這邊一次只有讀1byte
01/15 19:47, 5F

01/15 19:47, 5年前 , 6F
所以他這邊用了點小技巧,以0xABCD為例,他這邊做的事
01/15 19:47, 6F

01/15 19:47, 5年前 , 7F
相當於把0xABCD拆成0xAB00^0x00CD ,然後把^0x00CD這
01/15 19:47, 7F

01/15 19:48, 5年前 , 8F
件事移到你做八次除法後再做,因為XOR可結合可交換,
01/15 19:48, 8F

01/15 19:48, 5年前 , 9F
這樣子跟你把0xABCD直接做8次除法是一樣的,同理可證,
01/15 19:48, 9F

01/15 19:49, 5年前 , 10F
第三個byte如果是0xEF,那就是做完16次後補進來,結果
01/15 19:49, 10F

01/15 19:49, 5年前 , 11F
就等同於0xABCDEF做16次除法。
01/15 19:49, 11F

01/15 20:40, 5年前 , 12F
了解!太感謝了!
01/15 20:40, 12F

01/15 21:05, 5年前 , 13F
恩...那他為什麼不一口氣多讀點呢,想好久XD
01/15 21:05, 13F

01/15 21:13, 5年前 , 14F
我猜啦 一次做兩byte的話 len是奇數時應該要多一個判斷
01/15 21:13, 14F

01/15 21:13, 5年前 , 15F
一個一個讀就不會有這個問題 code會簡潔一些XD
01/15 21:13, 15F

01/15 21:21, 5年前 , 16F
不過一次多挖幾個進來應該會比較快(?) 這個就看需求
01/15 21:21, 16F

01/15 21:40, 5年前 , 17F
我是想說反正他都用 int,一次讀 4bytes 就可以直接用
01/15 21:40, 17F

01/15 21:40, 5年前 , 18F
的小於 0 做 MSB 的判斷,前後多處理一下 ptr 對齊跟 c
01/15 21:40, 18F

01/15 21:40, 5年前 , 19F
ount
01/15 21:40, 19F

01/15 23:07, 5年前 , 20F
MSB 判斷要另外做, 因為這裡判斷的是有無進位出去
01/15 23:07, 20F

01/15 23:07, 5年前 , 21F
也就是事實上判斷的是比 MSB 再出去一個 bit
01/15 23:07, 21F

01/16 10:54, 5年前 , 22F
判斷完才移出去吧?
01/16 10:54, 22F
文章代碼(AID): #1U7cyHJL (C_and_CPP)
文章代碼(AID): #1U7cyHJL (C_and_CPP)