首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

@版主 关于CRC的问题

@版主 关于CRC的问题

本帖最后由 shxr 于 2013-11-8 08:22 编辑

下面是版主曾经在一篇帖子http://bbs.21ic.com/forum.php?mo ... 5&page=1#pid3223407的回复。
我有些疑问,想请教版主。该程序适用于data为几位的情况。如果data为8位,则如何与crc1(0x6363)异或,高位扩展么?
data为16位的情况我已经验证过了,就是比较疑惑8位的情况。因为14443的CRC_A中没有给8为data的crc信息的例子,没法验证,求解惑。

“我去  14443还分了CRC_A和CRC_B   为什么要要搞两种啊   刚仔细研究了一下  给你计算出来了
他的初始值是0x6363   我们以前计算初始值一般都是0xffff   
还有计算不需要取反  CRC_B和15693协议的计算方法是一样的  
给你代码吧  你看看
unsigned short crc16_ccitt(unsigned char data,unsigned short crc1)
{
        unsigned short ccitt16 = 0x8408;
        int i;
        crc1 ^= data;   /*新的数据与原来的余数(就是crc)相加(加法就是异或操作)*/
        for(i=0;i<8;i++)
        {
                if(crc1 & 0x0001)  /*最低位为1,减去除数 */
                {
                        crc1 >>= 1;
                        crc1 ^= ccitt16;
                }
                else         /*最低位为0,不需要减去除数 */
                {
                        crc1 >>= 1;  /*直接移位*/
                }
        }
        return crc1;
}


int main()
{
        int i ;
        unsigned short crc;
        char data[11] ={0x00,0x00};
        crc = 0x6363;
        for(i=0;i<2;i++)
        {
                crc = crc16_ccitt(data,crc);
        }
//        crc = ~crc;
        printf("crc is %x",crc);
        return 0;
}
返回列表