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);
} |