CRC8算法通用版本
最近在开发一款新的芯片,涉及到crc8数据校验算法部分,现对此算法记录如下
- crc8参考网站
crc8
2.C语言实现代码如下
#include <stdio.h>
#include <stdint.h>#define CRC8_POLY 0x39 // 多项式值
#define CRC8_INIT 0x00 // 初始值
#define CRC8_OR 0x00 // 结果异或值
#define REFIN true // 输入数据字节反转
#define REFOUT true // 输出结果字节反转// 字节反转函数(8位)
uint8_t reverse_byte(uint8_t data) {uint8_t result = 0;for (int i = 0; i < 8; i++) {result <<= 1;result |= (data & 0x01);data >>= 1;}return result;
}uint8_t crc8_cal(const uint8_t* data, uint32_t length) {uint8_t crc = CRC8_INIT;uint8_t byte_data;for (uint32_t i = 0; i < length; i++) {// 根据RefIn参数决定是否反转输入字节if (REFIN) {byte_data = reverse_byte(data[i]);}else {byte_data = data[i];}crc ^= byte_data;// 处理8位数据for (int j = 0; j < 8; j++) {if (crc & 0x80) {crc = (crc << 1) ^ CRC8_POLY;}else {crc = crc << 1;}}}// 根据RefOut参数决定是否反转输出结果if (REFOUT) {crc = reverse_byte(crc );}//最终异或crc ^= CRC8_OR;return crc;
}
/*** 测试函数 - 验证算法正确性* 测试数据: 0xB4, 0x3C, 0xB5, 0x03, 0x56* 预期结果: */
int main()
{uint8_t result = 0;uint8_t test_data[] = { 0xB4, 0x3C, 0xB5, 0x03, 0x56 };uint16_t data_len = sizeof(test_data) / sizeof(test_data[0]);printf("测试数据: ");for (int i = 0; i < data_len; i++) {printf("%02X ", test_data[i]);}printf("\n");result = crc8_cal(test_data, data_len);printf("crc8_bluetooth_calculate 计算结果: 0x%02X\n", result);return 0;
}
3.可以结合网站上的计算和算法进行验证
