下面这个程序是我在一本书上看到的,但我看不懂,和网上的一些CRC算法程序好像不同,希望各位高手能帮我看看,最好能写下注释,谢谢~
unsigned int Crc_ccitt_good(const char *sz,int len)
{
const int poly = 0x1021;
unsigned short xor_flag;
unsigned short good_crc = 0xffff; for(int len1=0 ;len1<len ;len1++)
{
unsigned short i,v;
v = 0x80; for(i = 0;i<8;i++)
{
if(good_crc & 0x8000)
xor_flag = 1;
else
xor_flag = 0; good_crc = good_crc << 1; if(*sz & v)
good_crc = good_crc + 1; if(xor_flag)
good_crc = good_crc ^ poly; v = v >> 1;
}
sz++;
}
for(int j = 0; j< 16 ; j++)
{
if(good_crc & 0x8000)
xor_flag = 1;
else
xor_flag = 0; good_crc = good_crc << 1 ; if(xor_flag)
good_crc = good_crc ^ poly;
}
return good_crc;
}

解决方案 »

  1.   

    另外想请教下,有些程序为什么要将CRC寄存器的值设为全1,且将要处理的数据取反?实在想不明白。。
      

  2.   

    这是我的理解,请各位高手看看
    unsigned int Crc_ccitt_good(const char *sz,int len)
    {
    const int poly = 0x1021;
    unsigned short xor_flag;
    unsigned short good_crc = 0xffff; for(int len1=0 ;len1<len ;len1++) //数据总长度
    {
    unsigned short i,v;
    v = 0x80; for(i = 0;i<8;i++) //处理完8位数据
    {
    if(good_crc & 0x8000) //判断CRC寄存器最高位是否为1
    xor_flag = 1;
    else
    xor_flag = 0; good_crc = good_crc << 1; //CRC寄存器左移一位,
    //把要处理的数据移入CRC寄存器
    if(*sz & v) //判断要移入CRC寄存器的数据位是否为1
    good_crc = good_crc + 1;//为1则CRC寄存器+1,为0则不加 if(xor_flag) //移出的数据为1,则CRC寄存器与多项式相异或
    good_crc = good_crc ^ poly; v = v >> 1; //指向移入CRC寄存器的数据位
    }
    sz++; //处理下一个数据
    }
    for(int j = 0; j< 16 ; j++) //这下面的程序是干吗用的?按说上面那段程序得到的
    { //good_crc就是CRC校验和吧?不知我理解的对不?
    if(good_crc & 0x8000)
    xor_flag = 1;
    else
    xor_flag = 0; good_crc = good_crc << 1 ; if(xor_flag)
    good_crc = good_crc ^ poly;
    }
    return good_crc;
    }
      

  3.   

    明白了。。原来他把得到的CRC在进行了一次CRC。我晕。现在只剩下一个问题,就是CRC寄存器取全0,和CRC寄存器取全1有什么区别?取全1的话,程序应该怎样处理?我看到的资料都是取全0的,全1的我不是很明白,请各位高手帮忙解释下,谢谢,我的QQ15750163,有兴趣的可以加我好友,共同探讨一下