作者a1781781781 (嘎了给给)
看板C_and_CPP
标题[问题] CRC CCITT的问题
时间Wed Jan 15 09:46:54 2020
各位先进好
最近在学CRC 使用的多项式是CCITT
有在网路上找到演算法
https://i.imgur.com/5PpCksg.jpg
但我不太理解红框处在做什麽事情
感谢先进解答
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 49.215.231.152 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1579052817.A.4D5.html
1F:→ Lipraxde: ^ = xor, << = 位元左移 01/15 09:56
2F:→ a1781781781: 运算我懂,我不懂的是在对资料做怎样的处理,把新的 01/15 10:29
3F:→ a1781781781: 位元组加到旧的CRC再去算新的CRC? 01/15 10:29
4F:→ Lipraxde: 应该吧,我也不是很懂 CRC 01/15 10:31
5F:→ sarafciel: 16bit CRC是一次除2byte 但是他这边一次只有读1byte 01/15 19:47
6F:→ sarafciel: 所以他这边用了点小技巧,以0xABCD为例,他这边做的事 01/15 19:47
7F:→ sarafciel: 相当於把0xABCD拆成0xAB00^0x00CD ,然後把^0x00CD这 01/15 19:47
8F:→ sarafciel: 件事移到你做八次除法後再做,因为XOR可结合可交换, 01/15 19:48
9F:→ sarafciel: 这样子跟你把0xABCD直接做8次除法是一样的,同理可证, 01/15 19:48
10F:→ sarafciel: 第三个byte如果是0xEF,那就是做完16次後补进来,结果 01/15 19:49
11F:→ sarafciel: 就等同於0xABCDEF做16次除法。 01/15 19:49
12F:→ a1781781781: 了解!太感谢了! 01/15 20:40
13F:→ Lipraxde: 恩...那他为什麽不一口气多读点呢,想好久XD 01/15 21:05
14F:→ sarafciel: 我猜啦 一次做两byte的话 len是奇数时应该要多一个判断 01/15 21:13
15F:→ sarafciel: 一个一个读就不会有这个问题 code会简洁一些XD 01/15 21:13
16F:→ sarafciel: 不过一次多挖几个进来应该会比较快(?) 这个就看需求 01/15 21:21
17F:→ Lipraxde: 我是想说反正他都用 int,一次读 4bytes 就可以直接用 01/15 21:40
18F:→ Lipraxde: 的小於 0 做 MSB 的判断,前後多处理一下 ptr 对齐跟 c 01/15 21:40
19F:→ Lipraxde: ount 01/15 21:40
20F:推 LPH66: MSB 判断要另外做, 因为这里判断的是有无进位出去 01/15 23:07
21F:→ LPH66: 也就是事实上判断的是比 MSB 再出去一个 bit 01/15 23:07
22F:→ Lipraxde: 判断完才移出去吧? 01/16 10:54