CRC-8 算法详细解析
CRC(循环冗余校验)是一种非常流行的错误检测码,广泛应用于数据存储(如硬盘、光盘)和数字通信(如以太网、蓝牙、Wi-Fi)中。CRC-8 特指生成一个 8 比特(即 1 字节)校验和的 CRC 算法。
一、核心思想
CRC 的本质是 二进制多项式除法。
- 发送方和接收方预先约定一个固定的 生成多项式。
- 发送方将待发送的数据视为一个很长的二进制数,并用它除以生成多项式。
- 将计算得到的 余数(即 CRC 校验码)附加在原始数据的末尾一起发送出去。
- 接收方对收到的完整数据(原始数据 + CRC 码)进行同样的除法计算。
- 如果余数为 0,则认为数据在传输过程中极大概率没有出错。
- 如果余数 不为 0,则断定数据中肯定存在错误。
二、关键要素:生成多项式
CRC-8 的性能(即能检测出哪些错误)完全由其生成多项式决定。生成多项式通常用十六进制或二进制表示。
一些常见的 CRC-8 标准:
| 标准名称 | 生成多项式(十六进制) | 生成多项式(二进制) | 多项式表示 | 应用场景 |
|---|---|---|---|---|
| CRC-8 | 0x07 | 1000 0111 | x^8+x^2+x+1 | 通用,如 I2C 总线 |
| CRC-8/MAXIM (Dallas 1-Wire) | 0x31 | 0011 0001 | x^8+x^5+x^4+1 | DS18B20 温度传感器等 |
| CRC-8/CCITT | 0x07 | 1000 0111 | x^8+x^2+x+1 | 与通用 CRC-8 相同 |
| CRC-8/SAE J1850 | 0x1D | 0001 1101 | x^8+x^4+x^3+x^2+1 | 汽车网络 |
注意:最高位的 1(对应 x^8)通常被省略,因为它总是存在。所以 0x07 实际代表 9 比特的 1 0000 0111。
三、计算步骤(模二除法)
我们以一个简单的例子来说明计算过程。
- 待发送数据:
1101 0011(1 字节) - 生成多项式:采用 CRC-8/MAXIM,
0x31(二进制为0011 0001,实际除数为 9 位的1 0011 0001)
步骤 1:在数据末尾补 0
在数据的末尾补上 8 个 0(因为 CRC-8 的校验码长度是 8 位)。
原始数据: 1101 0011
补 0 后: 1101 0011 0000 0000


