You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用竖式多项式除法计算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

重复这个流程处理剩下的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 02:57:35