新晋码农一枚,小编会定期整理一些写的比较好的代码和知识点,作为自己的学习笔记,试着做一下批注和补充,转载或者参考他人文献会标明出处,非商用,如有侵权会删改!欢迎大家斧正和讨论!本章内容较多,可点击文章目录进行跳转!
小编整理和学习了机器人的相关知识,可作为扫盲使用,后续也会更新一些技术类的文章,大家共同交流学习!
您的点赞、关注、收藏就是对小编最大的动力!
机器人系列文章
机器人的“神经网络”:以太网技术如何重塑机器人内部通信?【技术类】
CRC校验:二进制除法的魔法如何守护你的数据安全?【技术类】
解密ROS:机器人时代的“安卓系统”,凭什么让开发者集体狂欢?【科普类】
边缘计算与云计算的协同发展:未来算力布局的核心逻辑【科普类】
2026年计算机专业求职指南:从简历优化到技术面试通关【科普类】
技术人的成长路径:从初级工程师到架构师的5个关键阶段【科普类】
别再盲目追“智能”:我与机器人打交道的3年,藏着最真实的科技温度【科普类】
目录
一、核心概念:什么是CRC?
CRC 的全称是 循环冗余校验。它是一种根据网络数据包或计算机文件等数据生成简短固定位数的校验码 的方法。
核心目的:检测数据的意外更改。无论是由于传输过程中的噪音、存储介质故障,还是其他干扰,只要原始数据发生了哪怕一个比特(bit)的改变,CRC校验码都会极大概率地不匹配。
一个生动的比喻:
想象你要寄送一个装有珍贵物品的箱子。
-
打包:在密封箱子前,你列出一份详细的物品清单,并将这份清单随箱寄出。
-
运输:箱子在运输途中可能会被颠簸、震动。
-
收货:收到箱子后,你打开它,并根据箱内的实际物品,重新列一份清单。
-
校验:你将新清单与随箱寄来的原清单进行对比。
-
如果两份清单完全一致,说明物品完好无损。
-
如果不一致,则说明运输过程中物品可能出现了损坏或丢失。
-
在这里:
-
珍贵物品 = 需要传输的原始数据
-
随箱寄出的物品清单 = 发送方计算并附加的CRC校验码
-
收货后重新列出的清单 = 接收方根据收到数据重新计算的CRC校验码
二、工作原理:它不是“计算”,而是“除法”
CRC的本质不是简单的加法或哈希,而是一种基于二进制模2除法的运算。
为了让您直观理解这个“除法”过程,下图模拟了CRC计算的核心步骤:

关键点解读:
-
模2除法:这是一种特殊的除法,它的核心是异或运算,不考虑借位。每一步都是进行比特位的异或操作。
-
生成多项式:图中所用的除数
1101是一个简化示例。在实际应用中,这个“除数”由一个被称为 “生成多项式” 的标准来定义。例如,以太网帧使用的CRC-32生成多项式就非常复杂。 -
校验过程:接收方进行同样的除法运算。如果传输无误,余数应为0;任何非零的余数都表明数据在传输中出错了。
三、为什么CRC如此强大?
CRC之所以被广泛使用,是因为它具有以下优点:
-
强大的错误检测能力:
-
能检测所有奇数个比特错误。
-
能检测所有长度小于等于CRC码长度的突发性错误。
-
在特定多项式下,能检测出绝大多数长度大于CRC码长度的突发错误。
-
例如,常用的CRC-32(32位校验码,如以太网使用),能够以极高的概率检测出几乎所有可能出现的传输错误。
-
-
计算效率高:
CRC的算法可以通过硬件实现(使用移位寄存器和异或门),计算速度非常快,这对高速网络和存储设备至关重要。软件实现也同样高效。
四、实际应用场景
你每天都会无数次地与CRC打交道,只是你感觉不到:
-
以太网帧:每个以太网帧的尾部都包含一个CRC-32校验码,用于检查数据在网线中传输时是否出错。
-
Wi-Fi:无线数据传输同样使用CRC来确保信号的完整性。
-
硬盘驱动:硬盘在读写数据时,会使用CRC来校验扇区数据的正确性。
-
压缩文件:ZIP、RAR等压缩文件的完整性校验也依赖于CRC。
-
数字图像:某些图像格式(如PNG)在文件中也存储了CRC码,用于检测文件是否损坏。
五、题目练习
题目一:基础计算题(难度:★☆☆☆)
题目描述:
已知发送方要传输的原始数据为 110101,双方约定的生成多项式为 1101(这是一个简单的CRC-4示例)。
-
计算:发送方应计算出的CRC校验码是多少?
-
验证:发送方最终发送的完整比特流是什么?
-
判断:如果接收方收到的比特流为
110101 010,请问传输过程中是否发生了错误?
答案:
1. CRC是101 2. 完整比特流是110101101 3.
这里如果计算正确,也可以跳过下面的解答部分
解答:
1.CRC为101
原始数据:110101,生成多项式:1101(4 位,因此 CRC 校验码为 3 位)
生成多项式 G(x) 对应二进制 1101,是 4 位,所以 n=4,需要在数据后面加 n−1=3 个 0。
步骤 1:扩展原始数据
在原始数据后添加 3 个 0(生成多项式位数 - 1),得到扩展数据:110101000(共 9 位)。
步骤 2:模 2 除法(逐位异或)完整过程(这里如果对异或运算不懂的,我会再出一个帖子)
-
取前 4 位:
1101(扩展数据前 4 位)与生成多项式1101异或1101 XOR 1101 = 0000,拉取第 5 位0→ 临时结果:00000。 -
处理低位 0:前 4 位为
0000(首位为 0,不满足与除数运算条件),依次拉取第 6 位1、第 7 位0、第 8 位0、第 9 位0→ 临时结果:01000(此时有效位为1000,4 位)。 -
第一次异或:
1000 XOR 1101 = 0101(4 位,等于除数位数,需继续运算)。 -
第二次异或:
0101 XOR 1101 = 1000(4 位,仍等于除数位数,需继续运算)。 -
第三次异或:
1000 XOR 1101 = 0101(4 位,此时已无更多位可拉取,且无法继续补位)。
步骤 3:确定最终余数(CRC 校验码)
- 生成多项式为 4 位,要求余数必须小于 4 位(即 3 位)。
- 最后一步得到的
0101是 4 位,需截取最低 3 位作为有效余数(因高位 0 不影响校验结果),即101。
结论:
正确的 CRC 校验码是 101。
注意:
这里有个点需要注意,为什么在过程4中出现结果为1000,1000小于1101,却不停止运算?
或者可以这么问:1000除不过1101,为什么不直接取余数100?
在模 2 除法中,“除不过” 的判断和常规除法不同,不能直接把1000当作余数,这是由 CRC 校验的运算规则决定的,具体原因如下:
1. 模 2 除法中 “够不够除” 的判断标准
在模 2 除法里,判断能否继续运算的依据是当前余数的最高位是否为 1,而不是数值大小:
- 生成多项式
1101是 4 位,最高位(第 4 位)为 1。 - 当余数是
1000时,最高位也是 1(4 位),满足 “与生成多项式位数相同且最高位为 1” 的条件,必须继续运算,不能直接截取低位作为余数。
只有当余数的最高位为 0,或者余数的位数小于生成多项式的位数时,才停止运算。
2. 1000必须继续运算的原因
1000和1101进行异或运算的结果是0101(1000 XOR 1101 = 0101),这一步是模 2 除法的必要步骤:
- 若直接取
1000的低位100作为余数,会导致校验码错误。 - 因为 CRC 校验的核心是 “让原始数据 + 校验码能被生成多项式整除(模 2 除法余数为 0)”,如果提前停止,这个条件就无法满足。
3. 正确余数的推导
继续运算到无法再进行为止:
1000 XOR 1101 = 0101(4 位,最高位为 0,此时虽位数仍等于生成多项式,但最高位为 0,无需继续运算)。- 最终余数取
0101的低 3 位(因校验码需为 3 位),即101。
总结
模 2 除法的规则决定了:只要余数最高位为 1 且位数等于生成多项式,就必须继续异或运算,不能提前截取低位。因此1000必须与1101运算,最终正确的 CRC 校验码是 **101**。
之前提到的100是计算过程中对 “有效位截取” 理解有误导致的错误结果。严格来说,当所有位处理完毕后,若余数仍为 4 位,需截取其最低 3 位作为校验码(因高位 0 不影响校验逻辑),因此最终结果应为101
2.完整比特流
根据我们刚才的正确计算:
-
原始数据:
110101 -
CRC 校验码:
101 -
完整发送比特流 = 原始数据 + CRC =
110101101
3.传输错误
原因分析:
-
正确的发送帧(根据我们计算)应该是:
110101101 -
接收方收到的帧是:
110101010 -
对比:
-
正确帧:
110101101 -
接收帧:
110101010
最后三位 CRC 部分从101变成了010,说明在传输中这三位发生了比特错误。
-
-
校验验证:
用接收帧110101010除以生成多项式1101,余数不为 0(余数为111),因此接收方能检测到错误。
题目二:综合分析与设计题(难度:★★★☆)
题目描述:
在一个通信系统中,使用CRC校验,生成多项式为 G(x)=x4+x2+x+1。
-
转换:请写出该生成多项式对应的二进制除数。
-
计算:假设待发送的数据字段为
1010 1101,请计算其CRC校验码。 -
验证:接收方收到了一个帧,其内容(数据和CRC)为
1010 1101 0110。请验证此帧是否正确。 -
分析:如果接收方验证通过(余数为0),是否能够100%确定数据在传输中没有出现任何错误?为什么?
最终答案:
-
二进制除数:10111
-
CRC 校验码:1110
-
帧正确性:错误(余数为1000 非 0)
-
100% 确定? 不能,存在漏检可能
解答:
1. 生成多项式转二进制除数
- 生成多项式:G(x)=x4+x2+x+1
- 转换规则:将每个幂次对应的系数映射为二进制位(1表示存在,0表示不存在)。
- 结果:
x4 → 1(最高位),x3 → 0,x2 → 1,x1 → 1,x0 → 1
二进制除数:10111
2. 计算CRC校验码
- 原始数据:
1010 1101(8位) - 生成多项式:
10111(5位) - CRC长度:4位(生成多项式位数-1)
- 计算步骤:
- 原始数据后添加4个零:
101011010000(12位)。 - 用生成多项式
10111进行模2除法:- 通过Python代码计算,余数为
1110(4位)。
- 通过Python代码计算,余数为
- 原始数据后添加4个零:
- CRC校验码:
1110 - 发送方完整比特流:
101011011110(数据+CRC)
3. 验证接收到的帧
- 接收帧:
1010 1101 0110(数据+CRC部分) - 验证过程:
- 将整个帧
101011010110(12位)作为被除数。 - 用生成多项式
10111进行模2除法。 - 余数为
1000(非零)。
- 将整个帧
- 结论:传输过程中发生错误(余数非零)。
4. 分析验证通过的可靠性
- 问题:若余数为0,是否100%确定数据无错误?
- 答案:否。
- 原因:
- CRC只能检测特定类型的错误(如突发错误),但无法覆盖所有可能的错误模式。
- 存在漏检可能性:若错误模式与生成多项式相关(例如错误多项式是生成多项式的倍数),余数仍可能为0,导致漏检。
- 例如,若数据在传输中被修改为另一个合法码字(与原始数据+CRC的差值是生成多项式的倍数),验证仍会通过,但数据已错误。
最终答案
- 二进制除数:
10111 - CRC校验码:
1110,完整比特流:101011011110 - 验证结果:帧错误(余数
1000≠0) - 分析:验证通过不能100%保证数据正确,因CRC存在理论漏检概率。

总结
CRC校验码是一个简短、高效且强大的“数据指纹”。它通过一种巧妙的二进制除法,为原始数据生成一个唯一的校验值。通过对比发送端和接收端的这个“指纹”,网络和设备能够以极高的可靠性判断数据是否完好无损,从而构成了现代数字世界可靠通信与存储的基石。


2046

被折叠的 条评论
为什么被折叠?



