循环冗余校验(英语:Cyclic redundancy check,通称“CRC”)是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
CRC算法参数模型解释:
NAME:参数模型名称。
WIDTH:宽度,即CRC比特数。
POLY:生成项的简写,以16进制表示。例如:CRC-8 (X8+X2+X+1)即是0x07,忽略了最高位的"1"(X8),即完整的生成项是0x107。
INIT:这是算法开始时寄存器(crc)的初始化预置值,十六进制表示。
REFIN:待测数据的每个字节是否按位反转,True或False。
REFOUT:在计算后之后,异或输出之前,整个数据是否按位反转,True或False。
XOROUT:计算结果与此参数异或后得到最终的CRC值。
Ps: PEFIN与PEFOUT需要数据按位反转,例如0x1C,二进制表示为 0001 1100,按位反转后0011 1000,即0x38;改变任一个参数都将使最终的CRC值变化。
模2除法求余数:
多字节数据CRC计算流程:
Ps: 模2除法求余数,首先需要让输入值与预置值异或,再进行计算;多字节数据计算中,前一字节求得的余数将作为新的预置值与后一字节进行按位异或。如上例,0x1C求余数得0x54,如果后一字节为0xA1,则需要先0x54 XOR 0xA1,再求余数。