crc校验 订阅
循环冗余校验码(CRC),简称循环码,是一种常用的、具有检错、纠错能力的校验码,在早期的通信中运用广泛。循环冗余校验码常用于外存储器和计算机同步通信的数据校验。奇偶校验码和海明校验码都是采用奇偶检测为手段检错和纠错的(奇偶校验码不具有纠错能力),而循环冗余校验则是通过某种数学运算来建立数据位和校验位的约定关系的。 [1-2] 展开全文
循环冗余校验码(CRC),简称循环码,是一种常用的、具有检错、纠错能力的校验码,在早期的通信中运用广泛。循环冗余校验码常用于外存储器和计算机同步通信的数据校验。奇偶校验码和海明校验码都是采用奇偶检测为手段检错和纠错的(奇偶校验码不具有纠错能力),而循环冗余校验则是通过某种数学运算来建立数据位和校验位的约定关系的。 [1-2]
信息
编码规则
前部分是信息码
移    位
原信息码(kbit)左移r位
中文名
循环冗余校验码
外文名
Cyclic Redundancy Check(CRC)
循环冗余校验码简介
循环冗余校验码(cyclie redundancy check)简称CRC(循环码),是一种能力相当强的检错、纠错码,并且实现编码和检码的电路比较简单,常用于串行传送(二进制位串沿一条信号线逐位传送)的辅助存储器与主机的数据通信和计算机网络中。 [3]  循环码是指通过某种数学运算实现有效信息与校验位之间的循环校验(而海明码是一种多重校验)。 [3]  这种编码基本思想是将要传送的信息M(X)表示为一个多项式L,用L除以一个预先确定的多项式G(X),得到的余式就是所需的循环冗余校验码。 [3]  这种校验又称多项式校验。 [3]  理论上可以证明循环冗余校验码的检错能力有以下特点:①可检测出所有奇数位错;②可检测出所有双比特的错;③可检测出所有小于、等于校验位长度的突发错。 [3] 
收起全文
精华内容
下载资源
问答
  • CRC校验

    万次阅读 多人点赞 2019-11-11 16:00:31
    什么是CRC校验? CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的...

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

    CRC校验原理:
    其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)。到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。如果有余数,则表明该帧在传输过程中出现了差错。
    模2除法:
    模2除法与算术除法类似,但每一位除的结果不影响其它位,即不向上一位借位,所以实际上就是异或。在循环冗余校验码(CRC)的计算中有应用到模2除法。
    例:

    CRC校验步骤:
    CRC校验中有两个关键点,一是预先确定一个发送送端和接收端都用来作为除数的二进制比特串(或多项式),可以随机选择,也可以使用国际标准,但是最高位和最低位必须为1;二是把原始帧与上面计算出的除数进行模2除法运算,计算出CRC码。

    具体步骤:
    1. 选择合适的除数
    2. 看选定除数的二进制位数,然后再要发送的数据帧上面加上这个位数-1位的0,然后用新生成的帧以模2除法的方式除上面的除数,得到的余数就是该帧的CRC校验码。注意,余数的位数一定只比除数位数少一位,也就是CRC校验码位数比除数位数少一位,如果前面位是0也不能省略。
    3. 将计算出来的CRC校验码附加在原数据帧后面,构建成一个新的数据帧进行发送;最后接收端在以模2除法方式除以前面选择的除数,如果没有余数,则说明数据帧在传输的过程中没有出错。

    CRC校验码计算示例:
    现假设选择的CRC生成多项式为G(X) = X4 + X3 + 1,要求出二进制序列10110011的CRC校验码。下面是具体的计算过程:
    ①将多项式转化为二进制序列,由G(X) = X4 + X3 + 1可知二进制一种有五位,第4位、第三位和第零位分别为1,则序列为11001
    ②多项式的位数位5,则在数据帧的后面加上5-1位0,数据帧变为101100110000,然后使用模2除法除以除数11001,得到余数。

    ③将计算出来的CRC校验码添加在原始帧的后面,真正的数据帧为101100110100,再把这个数据帧发送到接收端。
    ④接收端收到数据帧后,用上面选定的除数,用模2除法除去,验证余数是否为0,如果为0,则说明数据帧没有出错。

    二、运算规则
    RTU检查码(CRC)计算,运算规则如下:
    步骤1:令16位暂存器(CRC暂存器)= 0xFFFF。
    步骤2:异或第一个8位字节的消息指令与低位元16位CRC暂存器,做异或将结果存入CRC暂存器内。
    步骤3:右移一位CRC暂存器,将0填入高位元处。
    步骤4:检查右移的值,如果是0将步骤3的新值存入CRC暂存器内,否则异或0xA001与CRC暂存器,将结果存入CRC暂存器内。
    步骤5:重复步骤3〜步骤4,将8位全部运算完成。
    步骤6:重复步骤2〜步骤5,取下一个8位的消息指令,直到所有消息指令运算完成。最后,得到的CRC缓存器的值,即CRC的检查码。值得注意的是CRC的检查码必须交换放置于讯息指令的检查码中。

    三、相关代码
    扩展参看:C语言再学习 – 位操作

    int16_t factory_crc16 ( uint8_t *bufData, uint16_t buflen)
    {
        uint16_t TCPCRC = 0xffff;
        uint16_t POLYNOMIAL = 0xa001;
        uint8_t i, j;
       
        for (i = 0; i < buflen; i++)
        {
            TCPCRC ^= bufData[i];
            for (j = 0; j < 8; j++)
            {
                if ((TCPCRC & 0x0001) != 0)
                {
                    TCPCRC >>= 1;
                    TCPCRC ^= POLYNOMIAL;
                }
                else
                {
                    TCPCRC >>= 1;
                }
            }
        }
        return TCPCRC;
    }



    四、CRC校验原理及步骤
    参看:CRC校验原理及步骤

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

    2、CRC校验原理:
    其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为模2除法。到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。如果有余数,则表明该帧在传输过程中出现了差错。

    模2除法:
    模2除法与算术除法类似,但每一位除的结果不影响其它位,即不向上一位借位,所以实际上就是异或。在循环冗余校验码(CRC)的计算中有应用到模2除法。
    例:


    3、CRC校验步骤:
    CRC校验中有两个关键点,一是预先确定一个发送送端和接收端都用来作为除数的二进制比特串(或多项式),可以随机选择,也可以使用国际标准,但是最高位和最低位必须为1;二是把原始帧与上面计算出的除数进行模2除法运算,计算出CRC码。

    4、具体步骤:
    选择合适的除数
    看选定除数的二进制位数,然后再要发送的数据帧上面加上这个位数-1位的0,然后用新生成的帧以模2除法的方式除上面的除数,得到的余数就是该帧的CRC校验码。注意,余数的位数一定只比除数位数少一位,也就是CRC校验码位数比除数位数少一位,如果前面位是0也不能省略。
    将计算出来的CRC校验码附加在原数据帧后面,构建成一个新的数据帧进行发送;最后接收端在以模2除法方式除以前面选择的除数,如果没有余数,则说明数据帧在传输的过程中没有出错。
    5、CRC校验码计算示例:
    现假设选择的CRC生成多项式为G(X) = X4 + X3 + 1,要求出二进制序列10110011的CRC校验码。下面是具体的计算过程:
    ①将多项式转化为二进制序列,由G(X) = X4 + X3 + 1可知二进制一种有五位,第4位、第三位和第零位分别为1,则序列为11001
    ②多项式的位数位5,则在数据帧的后面加上5-1位0,数据帧变为101100110000,然后使用模2除法除以除数11001,得到余数。

    ③将计算出来的CRC校验码添加在原始帧的后面,真正的数据帧为101100110100,再把这个数据帧发送到接收端。
    ④接收端收到数据帧后,用上面选定的除数,用模2除法除去,验证余数是否为0,如果为0,则说明数据帧没有出错

    展开全文
  • CRC 校验

    千次阅读 2018-04-09 12:28:49
    匠心零度 转载请注明原创出处,谢谢! 说明 上篇RocketMQ(二):RPC通讯介绍了rocketmq的一些rpc细节,其实这些内容不仅仅...CRC即[循环冗余校验码]:是数据通信领域中最常用的一种查错校验码,其特征是信息字段...

    匠心零度 转载请注明原创出处,谢谢!

    说明

    上篇RocketMQ(二):RPC通讯介绍了rocketmq的一些rpc细节,其实这些内容不仅仅是rocketmq内容,任何通信模块基本都是类似的,这块内容是高度公用的,今天我们来看看 CRC 校验,也是通信模块里面常常使用到的技术。

    CRC简介

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

    CRC32检错能力极强,开销小,易于用编码器及检测电路实现。从其检错能力来看,它所不能发现的错误的几率仅为0.0047%以下。从性能上和开销上考虑,均远远优于奇偶校验及算术和校验等方式。因而,在数据存储和数据通讯领域,CRC无处不在:著名的通讯协议X.25的FCS(帧检错序列)采用的是CRC-CCITT,ARJ、LHA等压缩工具软件采用的是CRC32,磁盘驱动器的读写采用了CRC16,通用的图像存储格式GIF、TIFF等也都用CRC作为检错手段。

    CRC使用

    public static void main(String[] args) {
            int crc = crc32("欢迎关注:匠心零度".getBytes());
            int crc1 = crc32("欢迎关注:匠心零度".getBytes());
            int crc2 = crc32("欢迎关注:匠心零度!".getBytes());
    
            System.out.println(crc==crc1);
            System.out.println(crc== crc2);
        }
    
    
        public static int crc32(byte[] array) {
            if (array != null) {
                return crc32(array, 0, array.length);
            }
            return 0;
        }
    
        public static int crc32(byte[] array, int offset, int length) {
            CRC32 crc32 = new CRC32();
            crc32.update(array, offset, length);
            return (int) (crc32.getValue() & 0x7FFFFFFF);
        }

    输出结果:

    true
    false

    rocketmq部分使用

    crc32 JDK内部实现

    通过反复的移位和进行CRC的除法,最终该寄存器中的值就是我们所要求的余数。

    备注: 具体实现细节没有去细细了解,需要了解的请自行深入学习。


    如果读完觉得有收获的话,欢迎点赞、关注、加公众号【匠心零度】,查阅更多精彩历史!!!

    加入知识星球,一起探讨!

    展开全文
  • 轻松应用CRC校验CRC校验应用实例CRC校验应用实例CRC校验应用实例

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,055
精华内容 3,222
关键字:

crc校验