我用的是CRC-CCITT,16位的CRC校验。C程序如下: uint getcrc(uchar *s,uchar len) { uint acc=0,i,j=0; while(len--) { acc=acc^(*s++<<8); for(i=0;i++<8;) if(acc&0x8000) acc=(acc<<1)^0x1021; else acc=acc<<1; } return(acc); } 我知道这个程序是正确的,编译链接都没错,也知道CRC校验的原理:就是把我发送的二进制序列左移16位除以0x11021(简记为0x1021)所得的16位余数。 但我要传送的数据定义:uint x=9876;再定义: uchar buf[MAXLEN]; uchar len; len=strlen(buf); 其中buf[0]=0x09;buf[1]=0x08;buf[2]=0x07;buf[3]=0x06; uint ecc; 调用:ecc=getcrc(buf,len); 当然ecc就是发送数据uint x=9876所对应的16位CRC码,调试后的结果是 0xA387. 但是 我不明白如果我用笔算这个结果是怎么得到的?要发送的数据应对应什么样的二进制序列,除以0x11021才得0xA387。我已经试了无数种,都不能得到,但又肯定这个软件实现的结果是正确的。 请问大侠,这个发送数据应对应的二进制序列是什么? 0000 1001 0000 0000 0000 0000 .......?
|