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

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

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

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

#include

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;

}CRC16 标准:CRC16 使用 16 位校验码,常用于中等速率通信和一般校验场景。

#include

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;

}CRC32 标准:CRC32 使用 32 位校验码,常用于高速通信和强校验场景。

#include

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

相关推荐