- UID
- 114293
|
本帖最后由 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;
}
” |
|