CRC 校验
CRC 校验的计算与检验过程总结
CRC(循环冗余校验) 是一种常用的数据传输差错检测技术,其核心是利用模二除法(即按位异或)实现。结合上面的模二除法手算过程,CRC 的计算和检验流程可总结如下:
模二除法基本规则
- 运算规则类似十进制的长除法,但用的是异或(XOR),即 1+1=0,0+0=0,1+0=1。
- 不用借位和进位,只有 0 和 1。
- 只要被除数的前导位≥除数的位数,就继续除。
计算阶段(发送端)
-
选择生成多项式(除数) 通信双方预先约定一个生成多项式(如 1101),其二进制位数为 ,对应 CRC 校验码长度为 位。
-
数据后补零 将原始数据(被除数)后面补上 个 0,得到扩展数据。例如,数据为 101001000,除数为 1101(4 位),则补 3 个 0,变成 101001000000。
-
模二除法(异或运算) 用补零后的数据作为被除数,生成多项式作为除数,按模二除法(即异或)逐步计算,直到余数位数小于除数。 具体操作见上题手算过程:每次取当前余数的高位与除数对齐,做异或,余数左移补下一位,直到处理完全部位。
-
得到 CRC 校验码 最终得到的余数就是 CRC 校验码(长度为 位,不足需补零)。
-
拼接发送 将 CRC 校验码附加到原始数据后,形成完整的数据帧发送。
检验阶段(接收端)
-
数据接收 接收端收到的数据帧包括原始数据和 CRC 校验码。
-
再次模二除法 用同样的生成多项式,对整个接收帧(原始数据 + 校验码)做模二除法。
-
判断余数
- 若余数为 0,说明数据在传输过程中未发生差错。
- 若余数不为 0,说明数据在传输过程中发生了错误。
关键点与本质
- 模二除法本质:
- 运算过程只用异或(不进位、不借位),每一步都与普通长除法类似,但用异或代替减法。
- 每次余数高位为 1 时,才与除数异或,否则直接移位补下一个数据位。
- 校验码长度:
- CRC 校验码的位数总是比生成多项式少 1 位。
- 检错能力:
- 生成多项式的选择直接影响 CRC 的检错能力,不同应用场景有不同标准多项式。
流程图简化
-
发送端 原始数据 + r 位 0 → 模二除法 → 余数(CRC 码) → 拼接发送
-
接收端 收到的数据帧 → 模二除法 → 余数为 0(正确)/非 0(错误)
举例说明(结合上题过程)
- 数据:101001000
- 生成多项式:1101(4 位)
- 补 3 个 0:101001000000
- 模二除法,按位异或,最终余数如上题所示为 4 位(假设 0100)
- 发送帧:1010010000100
- 接收端用同样方法除以 1101,若余数为 0 则无错,否则有错
总结: CRC 校验的核心是:发送端将数据补零后用生成多项式做模二除法,余数作为校验码附在数据后发送;接收端收到后用相同方法检验,余数为 0 即数据正确。整个过程本质是按位异或的长除法运算。