CRC校验全解

这几天一直在看CRC校验算法。CRC版本众多,网站上实现算法一大坨,可一开始根本搞不清楚那个是哪个。连续上百度,哔哩哔哩,知乎看了很多解读CRC算法的,终于有了一些眉目,打算写下来,方便日后参考。


CRC算法核心其实只有一种,即二进制除法的实现,版本众多的原因主要有以下几个原因:

CRC字段的长度

多项式公式

初始值

输出是否水平翻转

输入是否水平翻转

结果异或值


我绝大多数的文章都只谈到了CRC字段的长度和多项式公式,没有涉及剩余的三项在crc算法中的应用。


CRC字段的长度,字段越长,对于crc算法的校验能力越强。如果我们用出错的概率来评估校验能力的话。N长度的字段,他的校验能力为1/2**N。此处的运算符号采用Python语言中的含义。

一般而言,我们取的长度主要有8位,16位和32位。当然也有一些比较奇特的,4位,5位和6位,还有7位。


多项式公式是我们二进制多项式算法中的除数。不同的算法往往取的多项式是不一样的。


初始值,是指CRC字段的初始值。常常是从0和全是1中选择。

输入反转。具体的操作方法实施将输入的数据按照字节为单位进行水平反转。比如01000001,翻转结果是10000010。

输出翻转。输出翻转的操作与输入翻转操作是一样的。只是输出翻转是将整个CRC字段进行水平翻转。

结果异或值,是用来和通过上述的算法算出来的结果进行异或的一个数据值。如果这个值是0的话,那么就相当于没有进行异或。

为什么需要这么多看起来乱七八糟的种类呢。这些算法分别针对不同的数据的检验。针对不同的数据的特性,比如说某些数据,一开始就会有大量的零,如果不采用输入翻转或者初始值的话,那么这些0就对于校验结果没有任何影响。这就如我们想要的结果有出入了,我们希望校验结果和数据是一一对应的,并且是唯一的。如果不唯一那么,校验结果也就失去了意义。因此这么多算法的出现,主要原因就是为了适应不同的数据字符串的特点。



下面就是一些例子了。

验证网站:http://www.ip33.com/crc.html


算法参数意义
CRC-16/IBM 算法参数

CRC16/IBM



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. 基本概念 1.1 模2运算   模2运算是一种二进制算法,CRC校验技术中的核心部分,因此,我们在分析CRC...
    starmier阅读 4,377评论 0 1
  • 奇偶校验、海明码、CRC循环冗余校验码 三种校验码比较重要,需要牢记,在计算机网络中用处较大 奇偶校验 根据被传输...
    正经龙阅读 13,179评论 0 1
  • 最近刚好有时间,整理了一下关于CRC的资料,详细对比了下程序的实现过程和原理,当然,高手都是不在意的。 本文主要介...
    漠漠彡阅读 26,852评论 1 10
  • 常见的数据校验方法 http://blog.csdn.net/ky_heart/article/details/5...
    用电热毯烤猪阅读 12,177评论 0 49
  • 首先要讲一下CRC16是什么 。 CRC是一种常见的校验,而CRC16呢,主要是因为校验结果是16个位,当然还有C...
    一路向东_lxd阅读 24,309评论 1 4

友情链接更多精彩内容