zoukankan      html  css  js  c++  java
  • CRC基本讲解

    基本讲解

    两个二进制数,分别为:1101 和1011。

    1101 与如下的多项式相联系:1x3+1x2+0x1+1x0=x3+x2+x0

    1011与如下的多项式相联系:1x3+0x2+1x1+1x0=x3+x1+x0

    最常用的几种生成多项式如下:

    CRC8=X8+X5+X4+X0

    CRC-CCITT=X16+X12+X5+X0

    CRC16=X16+X15+X2+X0

    CRC12=X12+X11+X3+X2+X0

    CRC32=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+X0

    有一点要特别注意,文献中提到的生成多项式经常会说到多项式的位宽(Width,简记为W),这个位宽不是多项式对应的二进制数的位数,而是位数减1。比如CRC8中用到的位宽为8的生成多项式,其实对应得二进制数有九位:100110001。另外一点,多项式表示和二进制表示都很繁琐,交流起来不方便,因此,文献中多用16进制简写法来表示,因为生成多项式的最高位肯定为1,最高位的位置由位宽可知,故在简记式中,将最高的1统一去掉了,如CRC32的生成多项式简记为04C11DB7实际上表示的是104C11DB7。当然,这样简记除了方便外,在编程计算时也有它的用处。

    对于上面的例子,位宽为4(W=4),按照CRC算法的要求,计算前要在原始数据后填上W个0,也就是4个0。

    CRC原理介绍(通俗讲)

    1、发送端
    1.1、 在发送端先将数据分组,每组k个数据。假定要传送的数据是M。
    1.2、在数据M后面添加供差错检测的n位冗余码,然后构成一帧发送出去,一共发送(k+n)位。
    虽然添加n位冗余码增大了数据传送的开销,但是可以进行差错检测,当传输可能出现差错时,付出这种代价是值得的。

    1.3、冗余码可以用下面的方法得出:
    3.1、用二进制模2运算进行2^n*M(相当于M左移n位)的运算。意思就是在M后面补n个0。现在M就变成了k+n位。
    1.3.2、用M除以收发双方事先商定的长度为n+1的除数P。
    1.3.3、得到的余数R,这个R就是FCS(帧检验序列)。将这个FCS序列加到M上然后发出去。

    2、接受端
    2.1、在接受端把接受到的数据以帧为单位进行CRC校验
    2.2、把收到的每一个帧都除以同样的除数P,然后检查余数R。
    2.3、如果余数R为0,如果在传输过程中没有差错。
    2.4、如果出现误码,那么余数R为零的概率是非常小的。

    基本方法

    在接收端对接收到的每一帧进行CRC检验后,若余数R为,则表示这个帧没有错,就接受。若R不为0,则判定这个帧出错,就丢弃。

    例:

    M=101001,P=1101,n=3。
    在发送端:
    1、M=(2^n*M);
    则:M=101001000
    2、用M除以P
    在这里插入图片描述
    3、得到余数R也就是FCS,将FCS加到M上,就得到了要发送的帧。
    M=101001000+FCS=101001001

    在接收端:
    接收到的每一帧都要进行差错检验,假设收到101001001,P=1101。
    在这里插入图片描述
    最后余数R=0,则判定这个帧没有出错。

  • 相关阅读:
    Centos 实现SSH证书登录
    Spring Boot 拦截器的使用
    Spring Boot 内置定时器的使用
    Spring Boot 整合Druid数据源(一)
    Spring Boot 整合滑动验证
    asp.ent core swagger
    Dapper.Contrib
    SonarQube
    Endpoint.Binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport)
    wcf messageEncoding="Mtom"
  • 原文地址:https://www.cnblogs.com/laohaozi/p/12537676.html
Copyright © 2011-2022 走看看