调试crc记录
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
如果想要直接将结果带入,需要软件去实现内部转换的接口
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!