[急]关于CRC效验,程序中最重要的三行代码没看懂,请达人指点.
遇到了CRC效验,以前没接触过,昨天开始看文档,原理还是比较清楚的,就是移位然后异或,再移位取下一个位,再异或,直到最后一位取余,就是CRC码.但是给出的实例程序中,最重要的三行代码实在看不懂,请各位高人指点一下:
#include <stdio.h>
int main( void )
{
unsigned int crc = 0;
unsigned char i;
unsigned char test = 0xC0;
for(i = 0x80; i != 0; i = i >> 1)
{
if((crc & 0x8000) != 0) /* 若只是判断crc(余数)是否可继续被除, */
/* 为何直接移位,而不是引进下一个test中的位 */
{
crc = crc << 1;
crc = crc ^ 0x1021;
}
else
{
crc = crc << 1;
}
if((test & i) != 0)
{
crc = crc ^ 0x1021; /*此处没看懂,异或的应该是test和0x1021。 为什么程序始终只用crc异或*/
}
}
printf("0x%x ",crc);
return 0;
}
int main( void )
{
unsigned int crc = 0;
unsigned char i;
unsigned char test = 0xC0;
for(i = 0x80; i != 0; i = i >> 1)
{
if((crc & 0x8000) != 0) /* 若只是判断crc(余数)是否可继续被除, */
/* 为何直接移位,而不是引进下一个test中的位 */
{
crc = crc << 1;
crc = crc ^ 0x1021;
}
else
{
crc = crc << 1;
}
if((test & i) != 0)
{
crc = crc ^ 0x1021; /*此处没看懂,异或的应该是test和0x1021。 为什么程序始终只用crc异或*/
}
}
printf("0x%x ",crc);
return 0;
}
在看到一点讲解说,这个地方是把序列进行了拆分.例如:二进制序列为1001 1010 1010 1111时,左移16位.
可拆分为1000 0000 0000 0000 (0000 0000 0000 0000) + 000 0000 0000 0000 (0000 0000 0000 0000) + 00 0000 0000 0000 (0000 0000 0000 0000) + 1 0000 0000 0000 (0000 0000 0000 0000) + ……
遇到首位为1时候,除以0x1021我可以理解,因为原本是除以11021的.但是因为最高位肯定得到0,所以可以用后15位和1021异或,但为什么后面也是直接用余数和1021异或,而且余数是直接移位.没有说考虑后一位的情况.
请有明白的人帮我疏导一下.我即使用debug也不知道这个算法怎么执行的.谢谢各位!