CRC算法基础疑问:校验方式、除数选择及计算步骤
CRC算法常见问题解答
问题1:针对字符串"HELLO WORLD!\0"的CRC计算方式
- 正确做法是对整个
[sz2]的完整二进制串[ar3]追加对应位数的0(比如用3位CRC就追加3个0),然后执行一次完整的长遍历循环,最终生成一个唯一的CRC校验和。 - 不要对每个字符单独计算:如果给每个字符追加0并生成校验和,会失去CRC校验整体数据完整性的核心作用——CRC的设计目标就是检测整个数据块的传输错误,而非单个字符。
问题2:除数(生成多项式)的选择与适配
- 核心选择依据:主要看你需要的错误检测能力(比如能检测单比特错误、双比特错误、突发错误的长度),以及CRC的位数(位数越长,错误检测能力越强,但计算开销越大)。
- 通用多项式是主流选择:不需要针对特定数据(比如
[sz2])单独计算。行业内有大量标准化的通用多项式:- 3位CRC(CRC-3):
1011(对应多项式x³ + x + 1) - 8位CRC(CRC-8):
0x07(二进制00000111,对应多项式x⁸ + x² + x + 1) - 16位CRC(CRC-16-CCITT):
0x1021(二进制1000000000100001,对应多项式x¹⁶ + x¹² + x⁵ + 1) - 32位CRC(CRC-32):
0x04C11DB7(对应多项式x³² + x²⁶ + x²³ + x²² + x¹⁶ + x¹² + x¹¹ + x¹⁰ + x⁸ + x⁷ + x⁵ + x⁴ + x² + x + 1)
- 3位CRC(CRC-3):
- 针对
[sz2]这种字符串:如果是普通传输场景,选CRC-3(1011)做简单校验足够;如果对错误检测要求高,比如串口或文件传输,选CRC-16或CRC-32即可。
问题3:数据开头为0时的CRC计算步骤
CRC计算逻辑和数据开头是否为0无关,统一遵循以下流程(以除数1011为例):
- 初始化余数为0,从数据的最高位开始逐位处理。
- 把余数和当前数据位拼接成一个长度等于除数位数(这里是4位)的片段:
- 如果片段的最高位是0,不需要和除数做XOR,直接把下一位数据挪入片段,继续判断。
- 如果片段的最高位是1,就和除数
1011做XOR,得到的结果作为新的余数,再挪入下一位数据。
- 你提到的XOR结果为
1111的情况,下一步是把这个1111作为新的余数,挪入下一位数据形成新的4位片段,重复上述判断和计算,直到所有数据位(包括追加的0)都处理完毕,最终的余数就是CRC校验和。
内容的提问来源于stack exchange,提问作者AJAMC
相关产品推荐
相关产品推荐

