打印

@版主 关于CRC的问题

[复制链接]
1280|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shxr|  楼主 | 2013-11-7 22:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 shxr 于 2013-11-8 08:22 编辑

下面是版主曾经在一篇帖子https://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;
}




相关帖子

沙发
zhangmangui| | 2013-11-7 23:27 | 只看该作者
谢谢   CRC校验分好多种  主要是左移和右移的区分  初始值的区分  如果初始值是0xffff
结果是要取反的  我给的计算公式就是用来计算字节的  也就是8bit
14443和15693等都是按字节发送的  需要计算的也是字节啊  
计算的结果是16bit  也是分高低两个字节发送出去的
你可能还没理解   

使用特权

评论回复
板凳
shxr|  楼主 | 2013-11-8 08:21 | 只看该作者
本帖最后由 shxr 于 2013-12-4 16:29 编辑

使用特权

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

本版积分规则

1

主题

2

帖子

0

粉丝