电子网首页 > 综合技术

[学习笔记]CRC-8校验算法实现

2025-11-19 02:39 | 来源:电子世界报

我们在上一篇帖子中,学习了CRC-8校验算法的实现原理。也是应论坛网友的回帖要求,在这里分享一下CRC-8校验算法的源代码示例,供大家参考,移植到自己的项目中。话不多说,先上源代码,再来解释:

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


推荐技术

返回顶部