1. CRC-8基础计算
任务目标
实现CRC-8校验算法,对给定字节序列计算校验值,并通过与已知正确结果比对来验证算法实现的正确性。本案例采用CRC-8标准多项式0x07(即x^8 + x^2 + x + 1),初始值为0x00,输入输出不做反转。
实现代码
#include <stdio.h>
#include <stdint.h>
#define CRC8_POLY 0x07
#define CRC8_INIT 0x00
uint8_t crc8(const uint8_t *data, size_t len) {
uint8_t crc = CRC8_INIT;
for (size_t i = 0; i < len; i++) {
crc ^= data[i];
for (int bit = 0; bit < 8; bit++) {
if (crc & 0x80)
crc = (uint8_t)((crc << 1) ^ CRC8_POLY);
else
crc = (uint8_t)(crc << 1);
}
}
return crc;
}
int main(void) {
// 测试数据: 0x01 0x02 0x03 0x04
uint8_t test_data[] = {0x01, 0x02, 0x03, 0x04};
uint8_t result = crc8(test_data, sizeof(test_data));
printf("CRC-8 = 0x%02X\n", result);
// 验证: 已知该输入序列的CRC-8(0x07, init=0x00)正确结果为0x85
if (result == 0x85) {
printf("验证通过: 结果与已知正确值一致\n");
return 0;
} else {
printf("验证失败: 期望0x85, 实际0x%02X\n", result);
return 1;
}
}
编译与运行
gcc -o crc8_demo crc8_demo.c
./crc8_demo
验证方法
程序内置了已知正确结果作为判定基准。输入数据{0x01, 0x02, 0x03, 0x04}在CRC-8/ATM(多项式0x07,初值0x00,无反转)配置下的校验值为0x85。运行程序后,若输出CRC-8 = 0x85且显示“验证通过”,则算法实现正确;若输出其他值或显示“验证失败”,说明位运算或多项式处理有误。
常见问题
- 多项式方向:本实现采用MSB-first(高位先处理)方式,即每次判断最高位
crc & 0x80后左移异或。若改用LSB-first,需将多项式反转(0xE0)并右移处理。 - 初值差异:不同CRC-8变体(如CRC-8/CDMA2000使用0xFF初值)会得到不同结果,务必确认所用参数与协议规范一致。