打印

哪位大哥帮忙解释一下CRC校验的原理?

[复制链接]
2340|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zjf0000|  楼主 | 2007-3-15 10:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是16位crc校验的程序
typedef unsigned char uchar;
typedef unsigned int uint;
code uchar crcbuff [] = { 0x00,0x00,0x00,0x00,0x06,0x0d,0xd2,0xe3};
uint crc; // CRC 码
void main(void)
{
uchar *ptr;
crc = 0; // CRC 初值
ptr = crcbuff; // 指向第一个Byte 数据
crc = crc16l(ptr,8);
while(1);
}
uint crc16l(uchar *ptr,uchar len) // ptr 为数据指针,len 为数据长度
{
uchar i;
while(len--)
{
for(i=0x80; i!=0; i>>=1)
{
if((crc&0x8000)!=0) {crc<<=1; crc^=0x1021;} 
else crc<<=1; 
if((*ptr&i)!=0) crc^=0x1021; 
}
ptr++;
}
return(crc);
}
那个来回的异或1021是什么意思??
谢谢!

相关帖子

沙发
zsh1980| | 2007-3-15 16:34 | 只看该作者

多项式有关

这跟原理有关,编码和解码都遵循一个统一的多项式,有CRC-32,CRC-16,CCITT

使用特权

评论回复
板凳
hotpower| | 2007-3-15 19:54 | 只看该作者

先玩玩菜农的网上CRC多种算法演算器(直接在网上运行)

使用特权

评论回复
地板
pheavecn| | 2007-3-15 20:43 | 只看该作者

老兄,你的网站中木马了呢,快杀杀。

使用特权

评论回复
5
hotpower| | 2007-3-15 23:01 | 只看该作者

我不会呀~~~

那是汽车电子给的,我也不知如何搞.

使用特权

评论回复
6
jimsboy| | 2007-3-16 22:27 | 只看该作者

CRC看得很头疼吧?

方法是把接收到的N个字节当成一个8*N位的超长数,然后对它用模2除法。
被除数是这个8*N位的数据,除数就是那个CRC计算式。从你的程序看来这是xmodem用的那种CRC计算方法(我忘了它叫什么名子了),从程序中看这个数是0x1021,而实际上这个除数是0x11021。
模2除法是这样来的,先将被除数的尾巴上补16个二进制的0(CRC-16是补16个0)。然后将这个数和被除数最高位对齐,进行xor运算,其他没有参与运算的部分直接平移下来(就和小学时计算除法的竖式一样移下来),有效数字前面的0就不要移下来了。对这个除过的数再次进行这样的运算,直到算完(被除数小于除数),这时的余数就是CRC结果了

使用特权

评论回复
7
yinhaix| | 2015-5-25 16:12 | 只看该作者

使用特权

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

本版积分规则

67

主题

421

帖子

1

粉丝