CRC校验

一. CRC基本原理

1.1 模二运算

**·**模二加法和模二减法的结果是相同的,并且与异或(XOR)运算的结果是一致的。

· 奇数个1相加得1,偶数个1相加得0

· 模二乘除法和普通乘除法一样演算,唯一的区别是,模二乘法在部分积相加时按模二加,模二除法部分余数相减时按模二减

这里重点关注模二除法,因为它与CRC算法密切相关,它有三个性质

  1. 当最后余数的位数小于除数位数时,除法停止

2.当被除数的位数小于除数位数时,则商数为0,被除数就是余数

3.只要被除数或部分余数的位数与除数一样多,且最高位为1,不管其他位是什么数,皆可商1

1.2 二进制系数多项式

对任意的二进制都构造与其对应的一个二进制系数多项式。

例如:10011B,其对应的二进制系数多项式为P ( x ) = x 4 + x + 1 P(x)=x^{4}+x+1P(x)=x

4+x+1

CRC算法中,对于二进制都是以二进制系数多项式去描述的

1.3 CRC算法

CRC算法的基本思想就是将传输的数据当作一个位数很长的数 。将这个数模二除以另一个数,得到的余数作为校验数据附加到原数据后面

实际应用时,发送方和接收方按以下方式通信

  1. 发送方和接收方在通信前,约定好一个预设整数作为除数

2.发送方在发送前根据原始数据和约定好的除数进行模二除法 运算运算生成余数(CRC码),然后将其附加到原始数据后面一起发送给接收方

3.接收方收到后将其模二除以约定好的除数,当且仅当余数为0时接收方认为没有差错。

1.4 CRC工作原理

  • 生成多项式:CRC 使用一个生成多项式(通常用二进制数表示),这是计算 CRC 码的基础。常见的生成多项式有 CRC-8、CRC-16 和 CRC-32 等。

  • 数据多项式 :原始数据被看作是一个二进制多项式,例如二进制数据 1011001 可以表示为多项式 x6+x4+x3+1

  • 模二除法:发送方将数据多项式与生成多项式做模二除法(即不带进位的二进制除法,按位进行异或)。余数即为 CRC 校验码,它会被附加到数据后面一起发送。

  • 校验:接收方接收数据和 CRC 校验码,并使用相同的生成多项式对接收到的整体数据进行模二除法。如果余数为 0,数据是无错的;如果余数非 0,说明数据在传输过程中出现了错误。

1.5 CRC计算

1.5.1 逐位计算

步骤 1:附加零位

将数据后面附加 4 个零位(对应生成多项式的位数减去 1)

步骤 2:模二除法

步骤 3:生成 CRC 码

步骤 4:接收方验证

1.5.2 查找表方法

步骤1:预处理多项式

CRC 算法使用一个生成多项式来表示数据块的二进制多项式

步骤2:对于每个可能的输入字节(即 0 到 255),计算它与生成多项式的余数(CRC)。这样就可以通过表格直接查找而不必每次都重新计算。

相关推荐
深邃-2 小时前
【数据结构与算法】-二叉树(2):实现顺序结构二叉树(堆的实现),向上调整算法,向下调整算法,堆排序,TOP-K问题
数据结构·算法·二叉树·排序算法·堆排序··top-k
We་ct5 小时前
LeetCode 5. 最长回文子串:DP + 中心扩展
前端·javascript·算法·leetcode·typescript
王老师青少年编程9 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【哈夫曼贪心】:合并果子
c++·算法·贪心·csp·信奥赛·哈夫曼贪心·合并果子
叼烟扛炮9 小时前
C++第二讲:类和对象(上)
数据结构·c++·算法·类和对象·struct·实例化
天疆说10 小时前
【哈密顿力学】深入解读航天器交会最优控制中的Hamilton函数
人工智能·算法·机器学习
wuweijianlove10 小时前
关于算法设计中的代价函数优化与约束求解的技术7
算法
leoufung11 小时前
LeetCode 149: Max Points on a Line - 解题思路详解
算法·leetcode·职场和发展
样例过了就是过了11 小时前
LeetCode热题100 最长公共子序列
c++·算法·leetcode·动态规划
HXDGCL11 小时前
矩形环形导轨:自动化循环线的核心运动单元解析
运维·算法·自动化
谭欣辰11 小时前
C++ 排列组合完整指南
开发语言·c++·算法