anvy178 发表于 2011-4-6 11:37:12

CRC 直接算法求助 贴上程序 望大虾指导下

void CRCTest()
{
unsigned short cRc_16=0;
unsigned short i=138;
cRc_16 = i<<8;
for(j=8;j>0;j--)
      {
       if(cRc_16&0x8000)               
       cRc_16=(cRc_16<<=1)^0x1021    //## (1)##
       else
       cRc_16<<=1;                  
      }
printf("%x\n",cRc_16);
}
就专门用一个数138测试一下这个程序 输出来的结果还真是对的 。 我想问一下在我标注(1)的这个语句为什么不是先跟0X1021异或再向前移一位的呢???
如果cRc_16这个数值的第一位是1的话那这个位不是没有处理到吗?按照上面的程序的话。

fnems 发表于 2011-4-6 13:00:17

0x1021实际上是0x011021的尾数。CRC16的 magic value有17位,CRC8的magic value有9位,等等。但是最高位总是1.

看样子LZ还没搞懂CRC的原理

fnems 发表于 2011-4-6 13:03:22

CRC在数学原理上,可以认为将原数据流,从高位到低位处理,通过与magic value做广义加法运算(实际上就是异或),让前面的位都变成0,剩下的就是CRC值。

可以对比小学的竖式笔算除法,除法过程中高位一点点减成0,剩下的尾数就是余数,这个余数对应CRC算法中的CRC校验值。

anvy178 发表于 2011-4-6 13:52:22

【1楼】fnems

0x1021实际上是0x011021的尾数。crc16的 magic value有17位,crc8的magic value有9位,等等。但是最高位总是1.
看样子lz还没搞懂crc的原理
-----------------------------------------------------------------------
先谢谢你的回答

有点愚钝啊想了 两天没想明白 总觉得是原理弄明了 但是一看C程序就感觉跟原理的对不上了。我把数据类型都定义为长整型后cRc_16=(cRc_16<<=1)^0x11021 跟 cRc_16=(cRc_16<<=1)^0x1021放到上面的程序里的结果是一样的。 为什么是这样呢?望继续关注下我脑袋实在是转不过弯来了

anvy178 发表于 2011-4-6 14:00:48

那是不是拿一个数跟0x1021做模2除法 和跟0x11021做模2除法的得出的余式是一样的吗?

fnems 发表于 2011-4-7 12:28:33

可以认为magic value里面最高位是用来把原数据串从头到尾遇到的1变成0用的。所以最高位那个1没有用,实际用的时候都用尾数。

我在这里也不好说明白,自己看wikipeida好了,那里讲得清楚些

http://en.wikipedia.org/wiki/Cyclic_redundancy_check

anvy178 发表于 2011-4-8 00:16:50

感谢 感谢
页: [1]
查看完整版本: CRC 直接算法求助 贴上程序 望大虾指导下