这四种参数决定了 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)。页面上的预设全部通过了这个测试,结果实时显示在参数区。
数据会不会上传?
不会。整个计算在浏览器里完成,断网也能用。