例如 CRC16,初值为0x0000, 求CRC16[0x1234]=0xCD96

第1步:
CRC[0x1234&0x0F]=CRC[0x04]=0xF001
0x1234变为0x0123

第2步:
(0xF001>>4) ^ CRC[(0xF001&0x0F) ^ (0x0123&0x0F)]=0x0F00 ^ CRC[0x01 ^ 0x03]
=0x0F00 ^ CRC[0x02]=0x0F00 ^ 0xD801= 0xD701
0x0123变为0x0012

第3步:
(0xD701>>4) ^ CRC[(0xD701&0x0F) ^ (0x0012&0x0F)]=0x0D70^ CRC[0x01 ^ 0x02]
=0x0D70^ CRC[0x03]=0x0D70^ 0x1400= 0x1970
0x0012变为0x0001

第4步:
(0x1970>>4) ^ CRC[(0x1970&0x0F) ^ (0x0001&0x0F)]=0x0197^ CRC[0x00 ^ 0x01]
=0x0197^ CRC[0x01]=0x0197^ 0xCC01= 0xCD96


演算结果0xCD96正确。


例如 CRC16,初值为0xFFFF, 求CRC16[0x1234]=0x7D97:

初始化: 0x1234 ^ 0xFFFF = 0xEDCB
第1步:
CRC[0xEDCB&0x0F]=CRC[0x0B]=0xB401
0xEDCB变为0x0EDC

第2步:
(0xB401>>4) ^ CRC[(0xB401&0x0F) ^ (0x0EDC&0x0F)]=0x0B40^ CRC[0x01 ^ 0x0C]
=0x0B40^ CRC[0x0D]=0x0B40^ 0x9C01= 0x9741
0x0EDC变为0x00ED

第3步:
(0x9741>>4) ^ CRC[(0x9741&0x0F) ^ (0x00ED&0x0F)]=0x0974^ CRC[0x01 ^ 0x0D]
=0x0974^ CRC[0x0C]=0x0974^ 0x5000= 0x5974
0x00ED变为0x000E

第4步:
(0x5974>>4) ^ CRC[(0x5974&0x0F) ^ (0x000E&0x0F)]=0x0597^ CRC[0x04 ^ 0x0E]
=0x0597^ CRC[0x0A]=0x0597^ 0x7800= 0x7D97


演算结果0x7D97正确。


使用演算工具:http://www.hotc51.com/HotPower_HotWC3.html

或查表:


CRC16Table[16]={
  0x0000,0xCC01,0xD801,0x1400,0xF001,0x3C00,0x2800,0xE401,
  0xA001,0x6C00,0x7800,0xB401,0x5000,0x9C01,0x8801,0x4400//注意本行的0xA001
};