| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 549 人关注过本帖
标题:[急]关于CRC效验,程序中最重要的三行代码没看懂,请达人指点.
只看楼主 加入收藏
casio1374633
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2010-3-11
收藏
 问题点数:0 回复次数:0 
[急]关于CRC效验,程序中最重要的三行代码没看懂,请达人指点.
遇到了CRC效验,以前没接触过,昨天开始看文档,原理还是比较清楚的,就是移位然后异或,再移位取下一个位,再异或,直到最后一位取余,就是CRC码.

但是给出的实例程序中,最重要的三行代码实在看不懂,请各位高人指点一下:
#include <stdio.h>
    int main( void )
    {
        unsigned int crc = 0;
        unsigned char i;
        unsigned char test = 0xC0;

        
            for(i = 0x80; i != 0; i = i >> 1)
            {
                if((crc & 0x8000) != 0)     /*   若只是判断crc(余数)是否可继续被除,       */
                                            /*   为何直接移位,而不是引进下一个test中的位  */
                {
                    crc = crc << 1;
                    crc = crc ^ 0x1021;
                }
                else
                {
                    crc = crc << 1;
                }
                if((test & i) != 0)
                {
                    crc = crc ^ 0x1021;      /*此处没看懂,异或的应该是test和0x1021。 为什么程序始终只用crc异或*/
                }
            }      
        printf("0x%x ",crc);
        return 0;
    }

在看到一点讲解说,这个地方是把序列进行了拆分.例如:二进制序列为1001 1010 1010 1111时,左移16位.
可拆分为1000 0000 0000 0000 (0000 0000 0000 0000) + 000 0000 0000 0000 (0000 0000 0000 0000) + 00 0000 0000 0000 (0000 0000 0000 0000) + 1 0000 0000 0000 (0000 0000 0000 0000) + ……

遇到首位为1时候,除以0x1021我可以理解,因为原本是除以11021的.但是因为最高位肯定得到0,所以可以用后15位和1021异或,但为什么后面也是直接用余数和1021异或,而且余数是直接移位.没有说考虑后一位的情况.

请有明白的人帮我疏导一下.我即使用debug也不知道这个算法怎么执行的.谢谢各位!
搜索更多相关主题的帖子: 效验 CRC 代码 
2010-04-14 14:38
快速回复:[急]关于CRC效验,程序中最重要的三行代码没看懂,请达人指点.
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013902 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved