当前位置:首页C语言 > 正文

CRC8/CRC16/CRC32常见几个标准的算法及C语言实现

作者:野牛程序员:2023-08-23 12:03:26C语言阅读 4592

CRC(循环冗余校验)是一种常用的校验算法,用于检测数据传输过程中的错误。常见的 CRC 标准包括 CRC8、CRC16 和 CRC32。以下是这几种标准的简单介绍以及用 C 语言实现的示例代码。

  1. CRC8 标准:CRC8 使用 8 位校验码,常用于一些低速率通信和简单校验场景。

    #include <stdio.h>
    
    uint8_t calculateCRC8(const uint8_t *data, int length) {
        uint8_t crc = 0;
        while (length--) {
            crc ^= *data++;
            for (int i = 0; i < 8; i++) {
                if (crc & 0x80) {
                    crc = (crc << 1) ^ 0x07; // 0x07 是 CRC8 多项式
                } else {
                    crc <<= 1;
                }
            }
        }
        return crc;
    }
    
    int main() {
        uint8_t data[] = {0x01, 0x23, 0x45, 0x67};
        int length = sizeof(data) / sizeof(data[0]);
    
        uint8_t crc = calculateCRC8(data, length);
        printf("CRC8: 0x%02X\\n", crc);
    
        return 0;
    }
  2. CRC16 标准:CRC16 使用 16 位校验码,常用于中等速率通信和一般校验场景。

    #include <stdio.h>
    
    uint16_t calculateCRC16(const uint8_t *data, int length) {
        uint16_t crc = 0xFFFF;
        while (length--) {
            crc ^= *data++;
            for (int i = 0; i < 8; i++) {
                if (crc & 1) {
                    crc = (crc >> 1) ^ 0xA001; // 0xA001 是 CRC16 多项式
                } else {
                    crc >>= 1;
                }
            }
        }
        return crc;
    }
    
    int main() {
        uint8_t data[] = {0x01, 0x23, 0x45, 0x67};
        int length = sizeof(data) / sizeof(data[0]);
    
        uint16_t crc = calculateCRC16(data, length);
        printf("CRC16: 0x%04X\\n", crc);
    
        return 0;
    }
  3. CRC32 标准:CRC32 使用 32 位校验码,常用于高速通信和强校验场景。

    #include <stdio.h>
    
    uint32_t calculateCRC32(const uint8_t *data, int length) {
        uint32_t crc = 0xFFFFFFFF;
        while (length--) {
            crc ^= *data++;
            for (int i = 0; i < 8; i++) {
                if (crc & 1) {
                    crc = (crc >> 1) ^ 0xEDB88320; // 0xEDB88320 是 CRC32 多项式
                } else {
                    crc >>= 1;
                }
            }
        }
        return crc ^ 0xFFFFFFFF;
    }
    
    int main() {
        uint8_t data[] = {0x01, 0x23, 0x45, 0x67};
        int length = sizeof(data) / sizeof(data[0]);
    
        uint32_t crc = calculateCRC32(data, length);
        printf("CRC32: 0x%08X\\n", crc);
    
        return 0;
    }

这些示例代码演示了 CRC8、CRC16 和 CRC32 的基本计算方法,以及相应的多项式。在实际应用中,可能需要根据具体的标准和需求来调整多项式等参数。


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击