请教CRC16/CCITT_FALSE标准及与CRC-16-CCITT的差异
CRC-16-CCITT 与 CRC16/CCITT_FALSE 的核心差异
这两个都是CRC16算法的常用变体,本质差异在于参数配置的不同,直接决定了计算结果的区别。下面从核心参数和实际效果两方面拆解:
核心参数对比
CRC算法的行为由5个关键参数决定,两者的差异集中在这几点:
| 参数项 | CRC-16-CCITT(标准版) | CRC16/CCITT_FALSE |
|---|---|---|
| 多项式(Polynomial) | 0x1021 | 0x1021 |
| 初始值(Initial) | 0xFFFF | 0x0000 |
| 输入字节反转 | 是 | 否 |
| 输出结果反转 | 是 | 否 |
| 输出异或值(XOR Out) | 0xFFFF | 0x0000 |
具体差异详解
初始值与计算起点
CRC-16-CCITT计算前会将CRC寄存器初始化为0xFFFF,相当于从一个非零值开始累加;而CCITT_FALSE的寄存器初始值是0x0000,从全零开始计算。输入字节的比特处理
CRC-16-CCITT会对每个输入字节的8个比特位做反转(比如字节0x12(二进制00010010)会被处理为0x48(二进制01001000));CCITT_FALSE则直接使用原始字节的比特顺序计算。最终结果的调整
CRC-16-CCITT计算完所有数据后,会先把CRC寄存器的16位结果整体反转,再和0xFFFF做异或运算得到最终值;CCITT_FALSE则直接输出寄存器的原始值(因为异或0x0000等于无操作)。
实际计算示例
拿输入单个字节0x00举例:
- CRC-16-CCITT的计算结果是
0x1D0F - CRC16/CCITT_FALSE的计算结果是
0x0000
注意点
不同工具、库对CRC的命名可能有混淆,比如有些地方会把“CRC-16-CCITT”指代其他参数变体。判断两个CRC是否一致,一定要核对5个核心参数,而不是只看名称。
内容的提问来源于stack exchange,提问作者FoundedSwag
相关产品推荐
相关产品推荐

