现在开始分析运算:
<1>对第一个二进制分序列求余数,竖式除法即为0x10000 ^ 0x11021运算,后面的0位保留;
<2>接着对第二个二进制分序列求余数,将第一步运算的余数*2后再和第二个二进制分序列一起对0x11021求余,这一步理解应该没什么问题。如果该分序列为0,无需计算。
<3>对其余的二进制序列求余与上面两步相同。
<4>计算到最后一位时即为整个二进制序列的余数,即为CRC校验码。
该计算方法相当于对每一位计算,运算过程很容易理解,所占内存少,缺点是一位一位计算比较耗时。
下面给出C语言实现方法:
代码如下:
unsigned char test[16] = {0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff}
unsigned char len = 16
void main( void )
{
unsigned long temp = 0
unsigned int crc
unsigned char i
unsigned char *ptr = test
while( len-- ) {
for(i = 0x80i != 0i = i >>1) {
temp = temp * 2
if((temp &0x10000) != 0)
temp = temp ^ 0x11021
if((*ptr &i) != 0)
temp = temp ^ (0x10000 ^ 0x11021)
}
ptr++
}
crc = temp
printf("0x%x ",crc)
}
unsigned int crc(unsigned char *buf,unsigned char len){
char i
unsigned int c_dat=0xffff//有的CRC校验这个值是0
for (len>0len--)//
{
c_dat ^= *buf
for(i=0i<8i++)
{
if((c_dat&0x1)==0x1)
{
c_dat >>= 1
c_dat ^= 0xa001
}
else
{
c_dat >>= 1
}
}
buf++
}
return c_dat
}