调试crc记录

发布时间 2023-07-20 22:54:21作者: Ru^,^sunflower

 

CRC校验(循环冗余校验)小知识

CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。

循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

 

CRC算法参数模型解释:
NAME:参数模型名称。WIDTH:宽度,即CRC比特数。
POLY:生成项的简写,以16进制表示。例如:CRC-32即是0x04C11DB7,忽略了最高位的"1",即完整的生成项是0x104C11DB7。
INIT:这是算法开始时寄存器(crc)的初始化预置值,十六进制表示。
REFIN:待测数据的每个字节是否按位反转,True或False。
REFOUT:在计算后之后,异或输出之前,整个数据是否按位反转,True或False。
XOROUT:计算结果与此参数异或后得到最终的CRC值。

crc_result = input 是否反转(也可能不反转,由模型决定),与初值一起输入。经过算式计算后,得到的输出再进行反转(由模型决定),再进行与固定值(有模型决定)异或,才能得到最终的结果

在嵌入式系统中,可能会遇到一种情况,使用硬件crc计算,硬件仅支持一次传输最大uint16或uint32长度的数据。如果要计算的数据多于这个长度,需要进行分段计算

而分段计算的下次的初值是由要求的,需要将结果进行异或过的,需要将结果进行反异或,才能得到下次的计算需要的初值。这个是由crc算法模型决定的,一段数据crc的计算,是经过与poly的多次运算得到,最后只对结果进行一次异或。

所以分段计算的初值需要反异或,才能作为初值进行二段计算。

举个例子

对于数据 12 34 56 78 使用标准CRC-16/CCITT-FALSE模型的计算结果

30EC

 

12 34 的计算结果

0EC9

如果需要分段计算,则需要将 0EC9 替换 标准CRC-16/CCITT-FALSE中的初值0000,并且需要计算的数据内容是56 78 

即:初值 0EC9 数据 56 78 得到的结果是 30EC

以上是不需要异或的模型

 

我们举一个更经典的 crc32模型

数据 12 34 56 78 的计算结果  

4A090E98

12 34 的计算结果

18999699

异或FFFFFFFF 结果 E7666966  

 E7666966  再进行反转  669666EF

二段计算

初值669666EF  数据 56 78 得到的结果

4A090E98

也就是二段计算已经不是标准的CRC-32,而是改变了初值的crc32

如果想要直接将结果带入,需要软件去实现内部转换的接口