原创
“手动的”CRC16IBM(A001)的16字表长查表演算过程
参见: CRC-16-IBM(A001)的16字表长查表程序
CRC16Table[16]={
0x0000,0xCC01,0xD801,0x1400,0xF001,0x3C00,0x2800,0xE401,
0xA001,0x6C00,0x7800,0xB401,0x5000,0x9C01,0x8801,0x4400//注意本行的0xA001
};
例如 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 }; |
|
16*2个字节“比拼”256*2个字节的结果:
循环次数是4次,而后者为2次。即速度降低1倍但空间被压缩16倍,不知菜农失败否~~~
|
文章评论(0条评论)
登录后参与讨论