CRC算法的困惑

NetMicrobe 2006-08-11 06:33:36
由于工作需要(^_^,java开发)最近在看PNG的文件格式,看到CRC算法,感觉比较有用,就找了找相关资料学习学习。

CRC码是一串2进制序列取余的结果,除数(或者叫多项式)不同,叫法不同,什么CRC-16,CRC-CCITT,CRC-32等等。

求CRC的大体意思是使用现有的CRC<<1,再加上本位的值(0或1),求出余数,就是当前的CRC。

( 以上是我的理解,不知道对不对,)

可是看到代码,却被 与或 糊涂了。

unsigned int cal_crc(unsigned char *ptr, unsigned char len) {
unsigned char i;
unsigned int crc=0;
while(len--!=0) {
for(i=0x80; i!=0; i/=2) {
if((crc&0x8000)!=0) {crc*=2; crc^=0x1021;} /* 余式CRC 乘以2 再求CRC */
else crc*=2;
if((*ptr&i)!=0) crc^=0x1021; /* 再加上本位的CRC */
}
ptr++;
}
return(crc);
}

总结下代码的意思是,CRC(16位)的最高位和当前的数据位异或,为1的话,CRC左移1位后,会异或0x1021,否则0的话,只是移位。

与或不过是0x1021中1对应的位取反,0对应的位保留,为何和取余数产生关系,不解啊~~~困惑~~~~

哪位知道的,给些意见,点拨小弟一下,这里先谢过了~~~呵呵
...全文
611 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ninghe524 2006-10-09
  • 打赏
  • 举报
回复
1001000111000000
10011
____10011
_________10011

_
_____|____|___|
10010|0011|100|0000
_____|____|___|_________
10011|____|___|
____1|0011|___|
_____|____|100|11
_____|____|___|
^

1、G(x)=10011,在T(x)最右边添加了4个0
2、可以看成是最右边的分隔线的左边我们用G(x)去构造了一个T(x)。然后就剩下了分隔线右边的“1100”就是CRC码。分隔线左边,纵向来看,每一列的“1”要为偶数,异或下来才为0。或者说横线下,所有纵列异或下来最后要和第一排的T(x)相同。

举例:
111110110111,0000
10011___1001,1
_10011___100,11
__10011___10,011
____10011

最后的CRC为0010
ninghe524 2006-10-09
  • 打赏
  • 举报
回复
不好意思。第二部分全部成乱的了。竖线应该对齐。
ninghe524 2006-10-09
  • 打赏
  • 举报
回复
我是这样理解的。写得有些略。但是跟一般的经典定义的理解方式不同。我认为要容易理解一些。欢迎共同讨论QQ:251989134


1001000111000000
10011
10011
10011

_
| | |
10010|0011|100|0000
_____|____|___|____
10011| | |
1|0011| |
| |100|11
| | |
^

1、G(x)=10011,在T(x)最右边添加了4个0
2、可以看成是最右边的分隔线的左边我们用G(x)去构造了一个T(x)。然后就剩下了分隔线右边的“1100”就是CRC码。分隔线左边,纵向来看,每一列的“1”要为偶数,异或下来才为0。或者说横线下,所有纵列异或下来最后要和第一排的T(x)相同。

举例:
111110110111,0000
10011 1001,1
10011 100,11
10011 10,011
10011

最后的CRC为0010

NetMicrobe 2006-08-16
  • 打赏
  • 举报
回复
谢谢超超,如水如烟。
可以还是不明白,:(
justin108 2006-08-15
  • 打赏
  • 举报
回复
这个是原理,若CPU快可以算,若内存多可以用查表法
mmmcd 2006-08-14
  • 打赏
  • 举报
回复
求CRC的大体意思是原01串后尾补上n个0,用这个“01多项式”除以某n-1项的“01多项式”。
除的过程中的“减法”就是按位异或。除得余数就是所求
NetMicrobe 2006-08-13
  • 打赏
  • 举报
回复
还是没有。。。。。。。。。。。。。。
NetMicrobe 2006-08-12
  • 打赏
  • 举报
回复
自己顶。。。。。。。。。。。。

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧