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