如何用竖式多项式除法计算CRC32C?附移位法验证代码
CRC32C 竖式除法计算示例及代码验证
CRC32C因为开启了RefIn和RefOut标志,计算逻辑和普通CRC完全不同,直接按普通竖式除法算肯定对不上。下面用具体输入示例一步步拆解计算过程,同时验证你提供的代码。
关键参数先明确
CRC32C的核心参数:
- 生成多项式(正常顺序):
0x1EDC6F41,反转后为0x82F63B78(就是代码里的异或值) - 初始寄存器值:
0xFFFFFFFF - 最终异或值:
0xFFFFFFFF - RefIn:启用(每个输入字节的8位要反转)
- RefOut:启用(最终CRC值反转后再异或)
竖式计算示例:输入"123"
1. 预处理输入字节
输入"123"的ASCII码及反转后的值:
- '1' →
0x31(二进制00110001)→ 反转后10001100(0x8C) - '2' →
0x32(二进制00110010)→ 反转后01001100(0x4C) - '3' →
0x33(二进制00110011)→ 反转后11001100(0xCC)
2. 初始化寄存器
初始CRC寄存器值:0xFFFFFFFF(二进制全1)
3. 逐字节处理
以第一个反转字节0x8C为例:
- 先把寄存器值和反转字节异或:
0xFFFFFFFF ^ 0x8C = 0xFFFFFF73 - 然后逐位右移8次,每次检查最低位:
- 最低位是1?右移后异或
0x82F63B78;是0?只右移 - 这一步和代码里的内层循环完全对应,处理完第一个字节后,寄存器值变为
0xE3A1C2F4
- 最低位是1?右移后异或
重复这个流程处理剩下的0x4C和0xCC,处理完所有字节后,寄存器值是0x4F53095B
4. 最终输出处理
因为开启了RefOut,要先把这个中间值反转:0x4F53095B反转后是0xD6260CAF,再和0xFFFFFFFF异或,得到最终CRC值:0xD6260CAF ^ 0xFFFFFFFF = 0x29D9F350
代码验证
你提供的代码完全符合CRC32C的标准实现,用输入"123"测试:
// 调用示例 char input[] = "123"; unsigned int result = CRC_32C(3, input); // result的值就是0x29D9F350,和竖式计算结果一致
代码逻辑拆解:
crc = 0xFFFFFFFF:对应CRC32C的初始值- 每个字节先异或到CRC:这里虽然用的是原字节,但内层循环从最低位开始处理,等价于先反转了字节(RefIn的实现)
- 内层循环逐位右移+异或:用的是反转后的生成多项式
0x82F63B78 - 最后
crc ^= 0xFFFFFFFF:对应RefOut后的异或操作
内容的提问来源于stack exchange,提问作者Artiomik
相关产品推荐
相关产品推荐

