zoukankan      html  css  js  c++  java
  • CRC校验

    什么是CRC

    CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

    CRC的基本原理

    在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码。对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。 校验码的具体生成过程为:假设要发送的信息用多项式C(X)表示,将C(x)左移R位(可表示成C(x)*2R),这样C(x)的右边就会空出R位,这就是校验码的位置。用 C(x)*2R 除以生成多项式G(x)得到的余数就是校验码。

    任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。

    基本概念

    对应关系
    多项式和二进制数有直接对应关系:X的最高幂次对应二进制数的最高位,以下各位对应多项式的各幂次,有此幂次项对应1,无此幂次项对应0。可以看出:X的最高幂次为R,转换成对应的二进制数有R+1位。

    多项式包括生成多项式G(X)和信息多项式C(X)。

    如生成多项式为G(X)=X4+X3+X+1, 可转换为二进制数码11011。

    而发送信息位 101111,可转换为数据多项式为C(X)=X5+X3+X2+X+1。
    生成多项式
    是接受方和发送方的一个约定,也就是一个二进制数,在整个传输过程中,这个数始终保持不变。

    在发送方,利用生成多项式对信息多项式做模2除生成校验码。在接收方利用生成多项式对收到的编码多项式做模2除检测和确定错误位置。

    应满足以下条件:
    A、生成多项式的最高位和最低位必须为1。
    B、当被传送信息(CRC码)任何一位发生错误时,被生成多项式做除后应该使余数不为0。
    C、不同位发生错误时,应该使余数不同。
    D、对余数继续做除,应使余数循环。

    校验码位数

    CRC校验码位数 = 生成多项式位数 - 1。注意有些生成多项式的简记式中将生成多项式的最高位1省略了。

    生成步骤

    1. 将X的最高次幂为R的生成多项式G(X)转换成对应的R+1位二进制数。
    2. 将信息码左移R位,相当于对应的信息多项式C(X)*2R。
    3. 用生成多项式(二进制数)对信息码做除,得到R位的余数(注意:这里的二进制做除法得到的余数其实是模2除法得到的余数,并不等于其对应十进制数做除法得到的余数。)
    4. 将余数拼到信息码左移后空出的位置,得到完整的CRC码。

    【例】假设使用的生成多项式是G(X)=X3+X+1。4位的原始报文为1010,求编码后的报文。

    解:

    1、将生成多项式G(X)=X3+X+1转换成对应的二进制除数1011。

    2、此题生成多项式有4位(R+1)(注意:4位的生成多项式计算所得的校验码为3位,R为校验码位数),要把原始报文C(X)左移3(R)位变成1010 000

    3、用生成多项式对应的二进制数对左移3位后的原始报文进行模2除(高位对齐),相当于按位异或:

    1010000
    1011


    0001000
    0001011


    0000011

    得到的余位011,所以最终编码为:1010 011

    原则

    若设码字长度为N,信息字段为K位,校验字段为R位(N=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得

    V(x)=A(x)g(x)=xRm(x)+r(x);

    其中: m(x)为K次原始的信息多项式, r(x)为R-1次校验多项式(即CRC校验和),

    g(x)称为生成多项式:

    g(x)=g0+g1x1+ g2x2+…+g(R-1)x(R-1)+gRxR

    发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC码字。

    生成方法

    借助于模2除法则,其余数为校验字段。

    例如:信息字段代码为: 1011001;对应m(x)=x6+x4+x3+1

    假设生成多项式为:g(x)=x4+x3+1;则对应g(x)的代码为: 11001

    x4m(x)=x10+x8+x7+x4 对应的代码记为:10110010000;

    采用模2除法则: 得余数为: 1010(即校验字段为:1010)

    发送方:发出的传输字段为: 1 0 1 1 0 0 1 1010

    信息字段 校验字段

    接收方:使用相同的生成码进行校验:接收到的字段/生成码(二进制除法)

    如果能够除尽,则正确,

    给出余数(1010)的计算步骤:

    除法没有数学上的含义,而是采用计算机的模二除法,即除数和被除数做异或运算。进行异或运算时除数和被除数最高位对齐,按位异或。


    1011001 0000
    ^ 11001


     0111101 0000
    

    ^011001
    1111 0000


    0011110000
    ^11001
    111000


    00111000
    ^11001
    111000
    ^11001


    001010

    则四位CRC校验码就为:1010。

    利用CRC进行检错的过程可简单描述为:在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的r位监督码(CRC码),附在原始信息后边,构成一个新的二进制码序列数共k+r位,然后发送出去。在接收端,根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。这个规则,在差错控制理论中称为“生成多项式”。

    备注:
    (1)生成多项式是标准规定的
    (2)CRC校验码是基于将位串看作是系数为0或1的多项式,一个k位的数据流可以看作是关于x的从k-1阶到0阶的k-1次多项式的系数序列。采用此编码,发送方和接收方必须事先商定一个生成多项式G(x),其高位和低位必须是1。要计算m位的帧M(x)的校验和,基本思想是将校验和加在帧的末尾,使这个带校验和的帧的多项式能被G(x)除尽。当接收方收到加有校验和的帧时,用G(x)去除它,如果有余数,则CRC校验错误,只有没有余数的校验才是正确的。

  • 相关阅读:
    mysql 函数 存储过程 事件(event) job 模板
    protobuf 无proto 解码 decode 语言 java python
    mitmproxy fiddler 抓包 填坑
    android adb 常用命令
    android机器人 模拟 踩坑过程
    RabbitMQ添加新用户并支持远程访问
    Windows下RabbitMQ安装及配置
    Java mybatis mysql 常用数据类型对应关系
    easyExcel 踩坑
    linux防火墙查看状态firewall、iptable
  • 原文地址:https://www.cnblogs.com/chan0311/p/9427328.html
Copyright © 2011-2022 走看看