打印

向“熟悉CRC校验C程序和原理的高手”请教

[复制链接]
2176|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yeyeenono|  楼主 | 2007-4-4 10:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  我用的是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 .......?

相关帖子

沙发
lucidmask| | 2007-4-4 11:51 | 只看该作者

re

你不是知道Crc的原理吗?笔算就是多项式除法吧

使用特权

评论回复
板凳
yewuyi| | 2007-4-4 15:48 | 只看该作者

笔算和你程序运算难道公式还不一样?

使用特权

评论回复
地板
yeyeenono|  楼主 | 2007-4-4 19:56 | 只看该作者

请各位仔细读下我主题写的!!!

我知道原理,会算二进制序列数据的CRC码。但程序中我所定义的数据是uint x=9876。求它的CRC得先转换成一串二进制的数吧?我不知道那串二进制数该如何表示,得到的结果和软件生成结果一致。请再仔细看下我写的原文

使用特权

评论回复
5
平常人| | 2007-4-4 21:00 | 只看该作者

把计算器打开:9876 = 2694H = 0010011010010100

使用特权

评论回复
6
mohanwei| | 2007-4-4 21:15 | 只看该作者

没见过这么用的,一般最好用查表法。

网上有很多现成的程序,还有详细的注释,你可以搜一下。

使用特权

评论回复
7
yeyeenono|  楼主 | 2007-4-6 11:26 | 只看该作者

以上方法都不行

1.9876 = 2694H = 0010011010010100  这种算法我已试过不对
2.9876化为00001001 00001000 00000111 00000110 0000000000000000也不对

使用特权

评论回复
8
平常人| | 2007-4-6 20:38 | 只看该作者

你是从最低位到最高位算的,还是倒过来算的?

使用特权

评论回复
9
xwj| | 2007-4-9 00:26 | 只看该作者

呵呵,研究出来了,同时也为自己的粗心汗颜

使用特权

评论回复
10
yeyeenono|  楼主 | 2007-4-11 14:15 | 只看该作者

俺也懂了

我前些天也弄出来了,楼上老兄的话我深有体会。
还是谢谢各位的回复了!

使用特权

评论回复
11
hotpower| | 2017-4-21 00:58 | 只看该作者
http://www.21ic.com/tools/HotWC3_V1.23.html

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

15

帖子

0

粉丝