这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 物联网技术 » [学习笔记]CRC-8校验算法实现

共1条 1/1 1 跳转至

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

院士
2024-02-20 17:42:45     打赏

我们在上一篇帖子中,学习了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校验算法及实现源代码。





关键词: CRC-8     校验     算法     CRC    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]