当前位置: 首页 > news >正文

crc校验原理是什么?

# CRC 差错检测技术
CRC(Cyclic Redundancy Check,循环冗余校验)是一种**基于多项式除法的差错检测技术**,广泛应用于数据传输(如网络、串口)和数据存储(如硬盘、U 盘)中,核心作用是通过对原始数据计算 “校验值”,让接收方验证数据是否在传输 / 存储过程中发生错误。
要理解 CRC 原理,需先建立一个核心类比:**将二进制数据视为 “多项式”,校验过程本质是 “多项式除法”**—— 用原始数据多项式除以一个预先约定的 “生成多项式”,得到的 “余数” 就是 CRC 校验值;接收方用同样的生成多项式重复计算,若余数为 0 则数据大概率无误,否则判定数据出错。


## 一、核心概念:多项式表示法
CRC 的第一步是将二进制数据转化为 “多项式”,规则如下:
* 二进制数的每一位对应多项式的一个 “项”;
* 第`i`位(从右往左数,起始为 0)的数值(0 或 1)是该项的 “系数”;
* 项的 “次数” 等于位的位置`i`。
例如:
二进制数据 `101101`(共 6 位),对应的多项式为:
`1×x⁵ + 0×x⁴ + 1×x³ + 1×x² + 0×x¹ + 1×x⁰`,简化为 `x⁵ + x³ + x² + 1`。


## 二、CRC 校验的核心要素
所有 CRC 计算都依赖 3 个预先约定的关键参数(发送方和接收方必须一致,否则校验失效):
1. **生成多项式(Generator Polynomial, G (x))**
由协议规定的固定多项式(如 CRC-8、CRC-16、CRC-32 对应不同的 G (x)),决定了校验的位数和性能。
例:常见的`CRC-8`生成多项式为 `x⁸ + x² + x + 1`,对应二进制 `100000111`(共 9 位,记为`G_len=9`);`CRC-32`(以太网、ZIP 文件用)的 G (x) 为 `x³² + x²6 + x²3 + x²2 + x¹6 + x¹2 + x¹1 + x¹0 + x8 + x7 + x5 + x4 + x2 + x + 1`,对应二进制 `100000100110000010001110110110111`(33 位)。
2. **原始数据(Data, D (x))**
待校验的二进制数据(如传输的数据包、存储的文件片段),设其长度为`D_len`(位数),对应的多项式为`D(x)`。
3. **CRC 校验值(Check Value, R (x))**
计算得到的 “余数”,其位数固定为 `G_len - 1`(如 CRC-8 的校验值为 8 位,CRC-32 为 32 位),记为`R_len = G_len - 1`。


## 三、CRC 计算的 4 个关键步骤(发送方)
CRC 的本质是 “**模 2 除法**”(即二进制的异或运算,无进位 / 借位),具体步骤如下:
### 步骤 1:扩展原始数据(左移补 0)
为了让除法的 “余数” 恰好是`R_len`位,需要先将原始数据`D`**左移**`R_len`**位**(相当于在二进制末尾补`R_len`个 0),得到扩展数据`D'`。
* 数学意义:`D'(x) = D(x) × x^R_len`(多项式乘以`x^R_len`,次数提升`R_len`);
* 示例:若`D=1011`(4 位,D\_len=4),`R_len=3`(对应 G\_len=4),则`D'=1011000`(7 位)。

### 步骤 2:模 2 除法(核心运算)
用扩展数据`D'`(二进制)除以生成多项式`G`(二进制),执行 “模 2 除法”:
* 模 2 除法规则:每一步用 “当前余数的最高位” 与 “G 的最高位” 对齐,然后进行**异或运算**(1⊕1=0,1⊕0=1,0⊕0=0),直到处理完`D'`的所有位;
* 关键区别:普通除法用 “减法”,模 2 除法用 “异或”,且无需考虑借位,计算更简单。

### 步骤 3:获取余数(CRC 校验值)
除法结束后,得到的 “余数” 就是 CRC 校验值`R`,其位数**恰好为**`R_len`**位**(若不足则在高位补 0)。
* 注意:若余数位数超过`R_len`,说明计算错误;若余数为 0,仍需保留`R_len`个 0 作为校验值。

### 步骤 4:拼接数据与校验值(发送)
将原始数据`D`与 CRC 校验值`R`拼接,得到 “待传输 / 存储的数据`T = D + R`”(二进制串联),发送给接收方(或写入存储介质)。
* 数学意义:`T(x) = D(x) × x^R_len + R(x)`,且`T(x)`能被`G(x)`整除(因为`D(x)×x^R_len = G(x)×Q(x) + R(x)`,所以`T(x)=G(x)×Q(x)`,Q (x) 是除法的商)。


## 四、CRC 校验的 2 个步骤(接收方)
接收方收到数据`T'`(可能是`T`,也可能因干扰出错)后,通过以下步骤验证数据完整性:
### 步骤 1:重复模 2 除法
用收到的`T'`(二进制)除以约定的生成多项式`G`(二进制),同样执行 “模 2 除法”。
### 步骤 2:判断余数是否为 0
* 若余数为 0:说明`T'`能被`G`整除,**数据大概率无错**(存在极小的 “漏检率”,但 CRC 算法已通过设计将漏检率降到极低);
* 若余数不为 0:**数据一定出错**(可能是位翻转、丢失或插入),接收方需请求重传(或触发纠错机制)。


## 五、直观示例:CRC-3 计算(简化版)
为了更清晰理解,用一个简化案例演示(生成多项式`G=1011`,即 G\_len=4,R\_len=3):
### 已知条件
* 原始数据`D=1010`(4 位,D (x)=x³ + x¹);
* 生成多项式`G=1011`(4 位,G (x)=x³ + x¹ + x⁰);
* R\_len=3,需补 3 个 0,扩展数据`D'=1010000`(7 位)。
### 模 2 除法过程(二进制)
```
  1001 (商Q,仅用于过程,最终无需保留)
  \-------
1011 | 1010000 (D' = 1010000)
  -1011 (第一步:D'前4位1010与G=1011异或,得0001)
  \-------
  00010 (将D'的第5位0下移,得00010)
  -0000 (G的最高位1与当前余数最高位0对齐,补0后异或,得00010)
  \-------
  000100 (将D'的第6位0下移,得000100)
  -00000 (同理,补0异或,得000100)
  \-------
  0001000 (将D'的第7位0下移,得0001000)
  -0001011 (对齐后异或:1000 ⊕ 1011 = 0011)
  \-------
  0011 (最终余数,即CRC校验值R=011,3位,高位补0)
```
### 结果
* CRC 校验值`R=011`(3 位);
* 待发送数据`T=D+R=1010 011`(7 位);
* 接收方校验:若收到`T=1010011`,除以`G=1011`的余数为 0,判定数据无误。


## 六、CRC 的关键特性
1. **检错能力强**
CRC 能 100% 检测出以下错误:
* 所有单比特错误(1 位翻转,如 0→1);
* 所有双比特错误(2 位翻转);
* 所有奇数个比特错误;
* 所有长度不超过`R_len`的突发错误(连续多位翻转,长度≤R\_len);
* 对于长度超过`R_len`的突发错误,漏检率极低(约为 1/2^R\_len,如 CRC-32 的漏检率仅 1/4294967296)。
2. **计算效率高**
模 2 除法本质是异或运算,可通过硬件电路(如移位寄存器)或软件(位运算)快速实现,适合高速数据传输(如以太网 10Gbps 速率)。
3. **参数可定制**
不同场景可选择不同的生成多项式(如 CRC-8 用于低速串口,CRC-32 用于文件校验,CRC-64 用于大容量存储),平衡检错能力和计算开销。


## 七、常见应用场景
* 网络通信:以太网(CRC-32)、PPP 协议(CRC-16)、蓝牙(CRC-16/CRC-32);
* 数据存储:硬盘 / U 盘(CRC-32)、CD/DVD(CRC-16);
* 文件校验:ZIP/RAR 压缩文件、PNG 图片、TFTP 传输(均用 CRC-32);
* 工业控制:Modbus 协议(CRC-16)、CAN 总线(CRC-15)。

总结:CRC 通过 “多项式模 2 除法” 将原始数据映射为固定长度的校验值,接收方通过重复除法验证数据完整性,是一种 “低成本、高可靠” 的差错检测技术,也是数字系统中最常用的校验方式之一。

http://www.hskmm.com/?act=detail&tid=18328

相关文章:

  • CF1385D a-Good String
  • 9月23日(日记里有)
  • 9月25日(日记里有)
  • Git 提交代码前,一定要做的两件事
  • 本地调试接口时遇到的跨域问题,十分钟解决
  • 用 Excel 快速处理接口返回的 JSON 数据
  • 调度的基本概念
  • Overleaf项目文件同步工具: olsync
  • CF1995D Cases
  • 日志| 编辑距离 | 最长有效括号 |
  • day5
  • 《etcd库——键值存储系统》 - 教程
  • 有一个函数只会返回0和1,且返回0和返回1的概率不等。要求只能通过这个函数生成一个等概率返回0和1的函数
  • AI智能体开发实战:17种核心架构模式详解与Python代码实现
  • 代码随想录算法训练营第十天 | 232. 用栈实现队列、225. 用队列实现栈、20. 有效的括号、删除字符串中的所有相邻重复项
  • 2025.9.26总结 - A
  • MySQL性能优化
  • 关于“悬荡悟空”决策机制的简要技术说明
  • 最小二乘问题详解1:线性最小二乘
  • 9月26日
  • 工程监理行业多模态视觉​​​​​​​大模型系统,打造工地行业全场景的监理智能生态
  • 完整教程:【鸿蒙心迹】摸蓝图,打地基
  • 正则表达式
  • LuatOS Air780EPM 实现 HTTP 通信:从原理到代码实践
  • 搜维尔科技:Senseglove Nova 2触觉手套:虚拟训练、VR/AR模拟和研究中的触觉反馈
  • 深入解析:盟接之桥EDI软件:中国制造全球化进程中的连接挑战与路径探索
  • 【STM32H7】基于CubeMX从零开始搭建的HAL库工程模板(包含串口重定向和DSP库)
  • 在Windows架构中安装Miniforge及python环境变量配置
  • 搜维尔科技:Force Dimension Omega力反馈设备遥操作工业机器人
  • 3. Ollama 安装,流式输出,多模态,思考模型 - Rainbow