unsigned char crc8_table[256];
void generate_crc8_table(unsigned char poly)
{
uint16_t i;
uint8_t j, crc;
for (i = 0; i < 256; i++)
{
crc = i;
for (j = 0; j < 8; j++)
{
if (crc & 0x80)
{
crc = (crc << 1) ^ poly;
}
else
{
crc <<= 1;
}
}
crc8_table[i] = crc;
// printf("crc8_tbl[%d] = 0x%02X\r\n", i, crc);
}
}
uint8_t calculate_crc8(unsigned char *data, int length, unsigned char poly)
{
unsigned char crc = 0;
int i;
for (i = 0; i < length; i++)
{
crc = crc8_table[crc ^ data[i]];
}
return crc;
}
int main(int argc, char const *argv[])
{
unsigned char data[] = {0x12, 0x34, 0x56, 0x78};
int length = sizeof(data) / sizeof(data[0]);
unsigned char poly = 0x07;
uint8_t crc_result;
generate_crc8_table(poly);
crc_result = calculate_crc8(data, length, poly);
printf("CRC-8 cksum = 0x%02X\n", crc_result);
return 0;
}在示例程序中:
generate_crc8_table()函数的作用是建立一张crc-8的查询表,以空间换些时间。我这里把生成函数贴出来,主要是为了大家能够学习到如何生成这个查询表,在项目中,我们仅需要在程序里面预置好这256个字节的数组即可。
calculate_crc8()函数的作用就是计算CRC-8的校验值了。将之前复杂的取余操作变更为了异或运算,加快了实现速度。毕竟,这点空间换回来的性能提升还是非常可观的。
今天有点小忙,过两天再为大家分享crc-16校验算法及实现源代码。
我要赚赏金
