shxr 发表于 2013-11-7 22:48

@版主 关于CRC的问题

本帖最后由 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 ={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]
查看完整版本: @版主 关于CRC的问题