CRC residue验证失败咨询:轻量8/16/32位CRC计算器开发疑惑
问题
我正在开发一款支持在线CRC目录中所有8位、16位和32位版本的轻量CRC计算器。我对residue参数感到困惑——按我的理解,该参数是对完整消息附加其CRC后计算得到的CRC寄存器值,但多数算法的验证都不生效。
我采用标准测试消息b"123456789"(十六进制为0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39)验证,计算该消息的CRC结果与目录中的check参数一致,但将check参数追加到测试消息后,预期得到residue参数的结果并未出现,约半数算法都存在此问题。
以下是部分算法的测试示例:
========================================================================== Algorithm Check Append Residue Result for TEST + Append ========================================================================== CRC-16/ARC 0xBB3D 0x3D 0xBB 0x0000 0x0000 CRC-16/ARC 0xBB3D 0xBB 0x3D 0x0000 0xC2E3 *DOES NOT MATCH* -------------------------------------------------------------------------- CRC-16/CDMA2000 0x4C06 0x06 0x4C 0x0000 0xA527 *DOES NOT MATCH* CRC-16/CDMA2000 0x4C06 0x4C 0x06 0x0000 0x0000 -------------------------------------------------------------------------- CRC-16/DNP 0xEA82 0x82 0xEA 0x66C5 0x993A *DOES NOT MATCH* CRC-16/DNP 0xEA82 0xEA 0x82 0x66C5 0x2BD4 *DOES NOT MATCH* ==========================================================================
无论以何种方式将CRC追加到消息中,CRC-16/DNP的结果似乎始终为0x993A,其他算法也存在类似情况。请问我遗漏了什么关键点?
解答
你遇到的核心问题是忽略了CRC算法的字节序(输出反转)和最终异或值这两个关键参数对residue验证的影响,以下是具体分析:
1. CRC输出的字节序必须匹配算法定义
每个CRC算法的refout参数决定了计算完成后是否需要对CRC值进行位反转,追加CRC到消息时,必须按照算法实际输出的字节顺序来追加,而非直接使用十六进制数值的书写顺序:
- 比如CRC-16/ARC的
refout为true,计算得到的0xBB3D会被位反转成0x3D BB(小端字节序),所以追加0x3D 0xBB才能得到residue值0x0000; - 而CRC-16/CDMA2000的
refout为false,输出的CRC就是原始寄存器值0x4C06,所以需要按大端顺序追加0x4C 0x06才能验证通过。
2. 最终异或值的处理不能忽略
很多算法在计算完成后会对寄存器值执行一次异或操作(对应xorout参数),验证residue时需要确保流程一致性:
- 追加CRC后的消息计算流程,必须和单独计算原消息CRC的流程完全一致,包括初始值、输入反转、输出反转、最终异或这所有步骤;
- 部分目录中
residue的定义是完成所有步骤(含最终异或)后的结果,少数情况可能是寄存器未做异或的原始值,需要核对算法的完整参数定义。
3. CRC-16/DNP的特殊情况
CRC-16/DNP的参数为:refin=true、refout=true、xorout=0xFFFF、residue=0x66C5。正确验证步骤是:
- 计算
123456789的CRC,得到0xEA82(这是经过输出反转和异或0xFFFF后的结果); - 将CRC按输出字节序(小端)追加到消息后,即消息变为
123456789 + 0x82 0xEA; - 计算新消息的CRC:寄存器完成位运算后,异或
0xFFFF之前的值是0x993A,异或后得到0x66C5,也就是目录中的residue值。
你之前得到的0x993A是未执行最终异或的寄存器原始值,说明验证时跳过了最终异或步骤,导致结果不符。
内容的提问来源于stack exchange,提问作者Marko Gulin
相关产品推荐
相关产品推荐

