CRC 循环冗余校验原理
CRC(Cyclic Redundancy Check,循环冗余校验)是一种通过对输入数据进行多项式模 2 运算,生成固定长度校验值的算法,用于验证数据完整性。
核心原理(4 步)
1. 定义核心参数
计算前需确定两个关键参数(不同 CRC 标准参数不同,如常见的 CRC-16/CCITT):
- 生成多项式(Generator Polynomial):16 位的二进制数(通常用十六进制表示),如
0x1021(二进制1000000100001),是 CRC 运算的”计算规则” - 初始值(Initial Value):计算开始前,先给一个 16 位的寄存器赋值(如 CRC-16/CCITT 初始值为
0xFFFF),作为运算起点
2. 数据预处理(补位)
将输入的二进制数据末尾补 16 个 0,目的是让最终运算结果能覆盖数据的所有位。
3. 模 2 除法运算(核心步骤)
用补位后的数据与生成多项式进行模 2 除法(仅涉及”异或”和”移位”,无减法):
- 规则:
1 XOR 1 = 0,1 XOR 0 = 1,0 XOR 0 = 0 - 从数据的最高位开始,取前 16 位与生成多项式进行”异或”,得到新的 16 位结果
- 将结果左移 1 位,再补入数据的下一位,形成新的 16 位数据,再次与生成多项式”异或”
- 重复上述步骤,直到处理完所有位,最终得到一个 16 位的余数
4. 结果处理(可选)
部分 CRC 标准会对最终的 16 位余数进行”异或后处理”(如与 0xFFFF 异或),处理后的结果即为最终 CRC 校验值。
简单类比
可将 CRC 比作**“数据称重”**:
- 生成多项式 = 称重的”标准砝码”(固定规则)
- 输入数据 = 待称重的”物品”
- CRC 校验值 = 物品的”重量”(固定长度,是物品的唯一”短标识”)
接收方只需重新”称重”(计算 CRC),若两次”重量”一致,说明数据未损坏。
关键特点
- 仅校验,不加密:原理是”数据映射”,无法反向推导原始数据,不能用于安全加密
- 高效快速:仅涉及异或和移位(简单位运算),对硬件/软件资源占用低
- 适合场景:嵌入式、通信等对性能敏感的场景
- 抗碰撞弱:不同数据可能生成相同校验值
常见 CRC 标准
| 标准 | 多项式 | 初始值 | 应用场景 |
|---|---|---|---|
| CRC-16/CCITT | 0x1021 | 0xFFFF | 通信协议 |
| CRC-16/IBM | 0x8005 | 0x0000 | USB 协议 |
| CRC-32 | 0x04C11DB7 | 0xFFFFFFFF | Ethernet、ZIP、PNG |
关联文档 -../网络 — 网络基础主页
- ../../storage/Ceph 分布式存储 — CRC 用于数据完整性校验
- ../../linux/system/Linux — 系统级数据校验