CRC检验
CRC校验实用程序库 在数据存储和数据通讯领域,为了保证数据的正确,就不得不采用检错的手段。在诸多检错手段中,CRC是最著名的一种。CRC的全称是循环冗余校验,其特点是:检错能力极强,开销小,易于用编码器及检测电路实现。从其检错能力来看,它所不能发现的错误的几率仅为0.0047%以下。从性能上和开销上考虑,均远远优于奇偶校验及算术和校验等方式。因而,在数据存储和数据通讯领域,CRC无处不在:著名的通讯协议X.25的FCS(帧检错序列)采用的是CRC-CCITT,WinRAR
NERO、ARJ、LHA等压缩工具软件采用的是CRC32,磁盘驱动器的读写采用了CRC16,通用
CRC(Cyclic Redundancy Check,循环冗余校验)是一种广泛用于数据传输和存储中的错误检测技术。它的主要目标是确保数据在传输过程中没有发生错误。CRC通过附加一个校验位序列,这个序列是根据原始数据计算得出的,使得整个数据包在传输后能够通过特定的校验算法进行验证,从而判断数据是否被完整无误地接收。
CRC的工作原理基于模2除法。数据被看作是一个二进制数字,然后除以一个预定义的生成多项式(通常是多项式的二进制表示),这个生成多项式决定了CRC的位数和特性。生成多项式通常表示为G(x),例如CRC-CCITT使用的生成多项式为G(x) = x^16 + x^12 + x^5 + 1,对应的十六进制值为0x1021。在模2除法中,没有借位的概念,因此每次除法操作都简单地将被除数的最高位移出并与生成多项式的最高位进行异或,以此类推,直到所有数据位都被处理。
当数据除以生成多项式后,如果没有余数,那么数据就是有效的。如果有余数,说明数据在传输过程中可能出现了错误。通常,这个余数会附加到原始数据的末尾,形成完整的CRC校验码,接收方再对收到的数据进行同样的CRC计算,对比计算得到的余数是否为零,来判断数据的完整性。
在实际应用中,为了提高计算效率,CRC的计算通常使用查表法。预先计算出所有可能的8位或16位数据对生成多项式取模的结果,并存储在一个查找表中。当需要计算CRC时,只需要根据当前的数据位查表获取相应的结果,大大减少了计算量。例如,给出的代码中包含了几个宏定义以及函数,用于快速计算CRC值。
`crcupdate`和`crcupdate16`这两个宏定义是用来更新CRC寄存器的,它们根据当前数据位和CRC寄存器的值从查找表中获取新的CRC值。`crchware`函数是传统的CRC算法实现,通过位移和异或操作逐位计算CRC。`mk-crctbl`函数用于构建CRC查找表,`crcupdate`和`crcrevupdate`则分别用于正序和反序CRC计算。对于CRC32,提供了`BuildCRCTable`、`CalculateBlockCRC32`和`UpdateCharacterCRC32`等函数,它们用于计算32位CRC值。
CRC算法通过高效的数据校验机制,为数据通信和存储提供了可靠的数据完整性保障。它的广泛应用体现在各种通信协议(如X.25)、文件压缩工具(如WinRAR)、磁盘驱动器读写、图像存储格式(如GIF、TIFF)等方面,确保了数据在传输和存储过程中的安全性。