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校验算法及实现源代码。