前言
在二次开发eCan上位机应用时,遇到了采用CRC(全称是循环冗余校验)32算法校验文件传输完整性的场景,浅浅地记录一下使用心得.
目录
数据校验概念
数据在传输的过程中,会受到各种干扰的影响,如脉冲干扰,随机噪声干扰和人为干扰等,这会使数据产生差错。为了能够控制传输过程的差错,通信系统必须采用有效的检错方案。因此产生了数据校验。
数据校验是为保证数据的完整性进行的一种验证操作。通常用一种指定的算法对原始数据计算出的一个校验值,接收方用同样的算法计算一次校验值,如果两次计算得到的检验值相同,则说明数据是完整的。
CRC校验算法
CRC计算原理
被校验的数据 除以 多项式,得到的余数就是CRC数值。不过这里的除法是模2除法,也就是异或。多项式是通信中双方约定数,可以自己定义,不过目前有各个领域定义好的,可直接用。
算法逻辑
初始化:设定一个预设值(如
0xFFFFFFFF
),作为 CRC32 的初始值。移位寄存器:对输入的数据进行逐个处理,将每个字节的数据移入到一个移位寄存器中。开始时,移位寄存器的值等于 CRC32 初始值。
异或操作:将移位寄存器的值与多项式值进行异或操作,得到一个新的结果。
查表操作:将上一步计算得到的结果与一个查找表中的数值进行异或操作,得到一个新的 CRC32 值。
输出结果:将最终的 CRC32 值与指定的输出值进行异或操作,并将结果输出作为加密结果。
流程图
CRC算法种类
{
//CRC算法名称 宽度 多项式 初始值 结果异或值 输入反转 输出反转
{"CRC4_ITU", 4, 0x03, 0x00, 0x00, E_TRUE, E_TRUE},
{"CRC5_EPC", 5, 0x09, 0x09, 0x00, E_FALSE, E_FALSE},
{"CRC5_ITU", 5, 0x15, 0x00, 0x00, E_TRUE, E_TRUE},
{"CRC5_USB", 5, 0x05, 0x1F, 0x1F,