Dev tool

CRC 校验计算

默认 CRC-7/MMC(SD 卡命令校验用的那套)。输入十六进制数据即可, 也可以切换成 CRC-8 / 16 / 32 或自定义参数。

常用参数 —
数据(十六进制)

支持 06 00 00、060000、0x06,0x00 等写法; 算 32 位值的 CRC 就填 4 个字节,例如 12 34 56 78

CRC 值(十六进制) —
十进制 —
二进制 —
参与计算的字节 —
自定义参数(多项式 / 初值 / 反射 / 异或)

—

这四种参数决定了 CRC 结果

CRC 不是「一个算法」,而是一族算法。同样叫 CRC-16,参数不同结果完全不同。 四个参数分别是:

  • poly(多项式):决定移位时异或什么值,是 CRC 的核心
  • init(初值):寄存器起始值,常见 0x00 或全 1
  • refin / refout(反射):数据位序是否倒置,串行通信低位先发时需要
  • xorout(结果异或):最后再异或一次,常见 0x00 或全 1

CRC-7/MMC 用在什么地方

SD 卡和 eMMC 的命令帧(CMD/ACMD)最后 8 位里,低 1 位是结束位,高 7 位就是这个 CRC。 计算范围是命令的起始位到最后一个数据位,共 40 位。如果你在写 SD 卡驱动, 握手阶段 CMD0 和 CMD8 的 CRC 是固定值(0x95 和 0x87),之后才会真正校验。

常见问题

CRC-7 的多项式为什么是 0x09?

0x09 展开成二进制是 1001,对应多项式 x⁷ + x³ + 1。最高位的 x⁷ 是隐含的(和浮点数的隐含前导 1 一个道理),所以只需要存低 7 位的系数 0001001 = 0x09。这个多项式是 SD/MMC 卡命令校验用的标准参数。

同一个数据,为什么别人的 CRC 和我算的不一样?

CRC 有四个可配参数:多项式、初值、输入反射(refin)、输出异或(xorout)。任何一项不同,结果就完全不同。比如 CRC-16 里 MODBUS 和 CCITT 的多项式、初值、反射全都不同,算出来自然不同。对接时一定要问清对方用的是哪套参数,而不是只说「CRC16」。

refin 和 refout 是什么?

反射(reflect)指把字节的位序倒过来,最低位当最高位用。refin 影响输入数据的每个字节,refout 影响最终结果。串行通信里数据常常是低位先发,这时就需要反射。CRC-16/MODBUS 和 CRC-32 都是 refin=refout=true。

怎么验证这个工具算得对?

标准做法是用字符串 "123456789" 的 ASCII 字节做测试,每种 CRC 参数都有一份公认的校验值(check)。页面上的预设全部通过了这个测试,结果实时显示在参数区。

数据会不会上传?

不会。整个计算在浏览器里完成,断网也能用。