发新帖我要提问
12
返回列表
打印

CRC半字节查表 与 ISO/IEC 14443-3

[复制链接]
楼主: lzqxs89
手机看帖
扫描二维码
随时随地手机跟帖
21
lzqxs89|  楼主 | 2013-6-19 15:46 | 只看该作者 回帖奖励 |倒序浏览
zhangmangui 发表于 2013-6-18 16:52
( ⊙ o ⊙ )是的   就是这儿的左移和右移之分

0x01的CRC-ccitt是 0x1189(CRC寄存器初值为0)?

运用下面这个“半字节查表法”的程序计算, 0x01的CRC-ccitt是 0x1021(CRC寄存器初值为0)?
#include<stdio.h>

unsigned short int crc_table[] = {
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef
};

/*------------------------------------------------------------------------------
按半字节计算CRC:计算本字节后的CRC码等于上一字节CRC码左移4位后,再加上上一字节余
式CRC高4位和本字节之和(分两次计算)后所求得的CRC码,如果我们把4位二进制序列数的
CRC全部计算出来,放在一个表里,采用查表法,每个字节算两次(半字节算一次),可以在
速度和内存空间取得均衡。
------------------------------------------------------------------------------*/
unsigned char test[] = {
0x01
};
unsigned char len = 1;

void main(void)
{
        unsigned short int crc = 0;
        unsigned char crc_H4;
        unsigned char *ptr = test;

        while( len-- )
        {
               
                crc_H4 = (unsigned char)(crc >> 12);
                crc = crc << 4;
                crc ^= crc_table[ crc_H4 ^ (*ptr >> 4)];
                crc_H4 = (unsigned char)(crc >> 12);
                crc = crc << 4;
                crc ^= crc_table[ crc_H4 ^ (*ptr & 0x0f)];
               
                ptr++;
        }

        printf("%x ",crc);
}

使用特权

评论回复
22
hotpower| | 2018-12-30 01:24 | 只看该作者

使用特权

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

本版积分规则