一、选定标准(通用:CRC8-0x07)
- 多项式:0x07
- 初始值:0x00
- 无输入反转
- 无输出反转
- 无最终异或
- 适用:LIN 总线、传感器、UART、I2C
固定规则
crc初始值 =0x00- 对每个字节:
crc = crc ^ 字节- 循环8 次:
- 如果得到的
crc结果(最高位 = 1)则 →crc = (crc << 1) ^ 0x07 - 否则→
crc = crc << 1
- 如果得到的
二、数据示例
待校验数据:2 个字节 →0x320x01要算出它的CRC8 校验值
三、手动计算全过程
初始状态
crc = 0x00
处理第 1 个字节:0x32
crc = crc ^ 0x32 = 0x00 ^ 0x32 = 0x32- 对 0x32 循环8 次移位判断:
0x32 =00110010
- 最高位 = 0 → 左移 → 0x64
- 最高位 = 0 → 左移 → 0xC8
- 最高位 = 1 → 左移 + 异或 0x07 → 0x97
- 最高位 = 1 → 左移 + 异或 0x07 → 0x29
- 最高位 = 0 → 左移 → 0x52
- 最高位 = 0 → 左移 → 0xA4
- 最高位 = 1 → 左移 + 异或 0x07 → 0x4F
- 最高位 = 0 → 左移 → 0x9E
更详细:
第 1 次
最高位 0 → 左移 1 0011 0010 << 1 =0110 0100 (0x64)
第 2 次
最高位 0 → 左移 1 0110 0100 << 1 =1100 1000 (0xC8)
第 3 次
最高位1→ 左移 1 再异或 0x07 0xC8 << 1 = 0x90 0x90 ^ 0x07 =1001 0111 (0x97)
第 4 次
最高位1→ 左移 1 再异或 0x07 0x97 << 1 = 0x2E 0x2E ^ 0x07 =0010 1001 (0x29)
第 5 次
最高位 0 → 左移 1 0010 1001 << 1 =0101 0010 (0x52)
第 6 次
最高位 0 → 左移 1 0101 0010 << 1 =1010 0100 (0xA4)
第 7 次
最高位1→ 左移 1 异或 0x07 0xA4 << 1 = 0x48 0x48 ^ 0x07 =0100 1111 (0x4F)
第 8 次
最高位 0 → 左移 1 0100 1111 << 1 =1001 1110 (0x9E)
👉 处理完第 1 字节:crc = 0x9E
处理第 2 个字节:0x01
crc = 0x9E ^ 0x01 = 0x9F→1001 1111- 对 0x9F 循环8 次移位判断:
最终 8 次算完结果:👉crc =0xD4
其中8次循环细节
- 最高位 1 → <<1=0x3E ^0x07 = 0x39
- 最高位 0 → <<1 = 0x72
- 最高位 0 → <<1 = 0xE4
- 最高位 1 → <<1=0xC8 ^0x07 = 0xCF
- 最高位 1 → <<1=0x9E ^0x07 = 0x99
- 最高位 1 → <<1=0x32 ^0x07 = 0x35
- 最高位 0 → <<1 = 0x6A
- 最高位 0 → <<1 = 0xD4
四、最终结果
数据:0x32, 0x01CRC8 校验值 =0xD4
CRC8(0x32, 0x01) = 0xD4
五、发送端与接收端完整流程
发送端
- 原始数据:
0x32 0x01 - 计算 CRC8:0xD4
- 发送:0x32 0x01 0xD4
接收端
- 收到:
0x32 0x010xD4 - 对前 2 字节重新计算 CRC8 → 得到 0xD4
- 对比收到的 CRC 与计算值一致 → 数据正确
六、可直接运行的 C 代码(验证结果)
c语言
#include <stdio.h> #include <stdint.h> uint8_t CRC8_Calc(uint8_t *data, uint32_t len) { uint8_t crc = 0x00; while(len--) { crc ^= *data++; for(int i=0; i<8; i++) { if(crc & 0x80) crc = (crc << 1) ^ 0x07; else crc <<= 1; } } return crc; } int main(void) { uint8_t buf[2] = {0x32, 0x01}; uint8_t crc = CRC8_Calc(buf, 2); printf("CRC8 = 0x%02X\n", crc); return 0; }运行输出
CRC8 = 0xD4✅ 和手算完全一致
七、示例对应真实场景
这就是车载 LIN 总线传感器帧的真实校验:
- 0x32 = 传感器 ID
- 0x01 = 有效数据
- 0xD4 = CRC 校验汽车车窗、雨刮、空调面板 都用这套逻辑。