CRC 计算和验证步骤 | AI生成和翻译
问题: 在向信息比特串追加 4 个零(使用 generator polynomial 11001)后,如何进行 CRC 计算并在接收端验证?
答案:
完整的 CRC 工作流程:计算与验证
我们全程使用一个具体示例:
- 消息 (D):
10110110 - 生成多项式 (G):
11001(次数 r = 4)
步骤 1 — 向消息追加 r 个零
由于 G 的次数为 4,因此向 D 追加 4 个零:
原始消息: 10110110
追加后: 101101100000 ← 这是 D × 2^r
步骤 2 — 执行模 2 除法(XOR 长除法)
模 2 二进制除法过程类似于熟悉的长除法,只不过每步使用 XOR 而非减法。
规则:
- 如果当前最高位为
1→ 与生成多项式11001执行 XOR - 如果当前最高位为
0→ 与00000执行 XOR(即仅移位/取下下一位) - 每次 XOR 的结果成为下一个工作值;取下下一位
被除数:101101100000
除数: 11001
逐步 XOR 长除法:
101101100000
11001
---------
10111 ← XOR 结果(舍弃前导 0)
101110 ← 取下下一位
11001
---------
10111 ← XOR 结果
101110 ← 取下下一位
11001
---------
10111
101110 ← 取下下一位
11001
---------
10111
101110 ← 取下下一位
11001
---------
10111
...继续直到没有剩余位...
最终余数 (R) = 1110 ← 4 位(= G 的次数)
注意: 余数始终正好有 r 位(此处为 4 位)。如果原始余数少于 r 位,则补前导零。
步骤 3 — 形成发送帧
CRC 位(余数 R)追加到原始数据末尾,形成发送帧,使完整帧正好能被生成多项式 G 整除。
发送帧 T = 原始消息 + CRC 位
T = 10110110 + 1110
T = 101101101110
步骤 4 — 接收端验证
可以通过再次执行相同除法来验证接收消息的有效性,这次使用追加的 CRC 校验值(而非零)。如果没有可检测错误,余数将为零。
在接收端,将整个接收帧 T 除以 G:
接收帧: 101101101110
除数: 11001
执行模 2 除法...
最终余数 = 0000 ✅ ← 未检测到错误
如果发生位错误,例如帧变为 111101101110:
接收帧: 111101101110
除数: 11001
最终余数 = 某个非零值 ❌ ← 检测到错误!
如果余数为零,则假设数据单元完整并被接受。非零余数表示发生了错误。
总结表格
| 步骤 | 操作 | 示例 |
|---|---|---|
| 1 | 向消息追加 r 个零 | 10110110 → 101101100000 |
| 2 | 使用 XOR(模 2)除以 G | 101101100000 ÷ 11001 |
| 3 | 余数 R = CRC 位 | R = 1110 |
| 4 | 发送:消息 + R | 101101101110 |
| 5 (接收端) | 将接收帧除以 G | 余数 = 0000 → 无错误 |
关键特性
- 发送帧 T(x) 具有关键特性,即它正好能被 G(x) 整除 — 意味着 G(x) 是 T(x) 的因子。
- r 位余数(k−1 位,其中 k = 生成多项式的长度)在发送端追加。在接收端,如果除法的余数为 0,则数据无错误。
- CRC 能检测长度 ≤ r 位的 所有突发错误(生成多项式的次数)。
参考资料:
- GeeksforGeeks – Modulo-2 Binary Division
- Wikipedia – Cyclic Redundancy Check
- CS Williams – CRC Lecture Notes
- UMass Interactive CRC Problems