精华内容
下载资源
问答
  • 循环冗余计算的效验码

    千次阅读 2013-12-30 12:00:05
    一般的XOR CRC16 校验码的计算

    1、XOR CRC16 的校验方式

    一般的XOR CRC16 校验码的计算:

    代码如下:

    #include <stdio.h>
    
    unsigned char crchi[256]={
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
    0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
    0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
    0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
    0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 
    0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 
    0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 
    0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
    0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
    0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
    0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
    0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 
    0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
    };
    
    unsigned char crclo[256]={
    0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 
    0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 
    0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 
    0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 
    0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 
    0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
    0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 
    0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 
    0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
    0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 
    0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 
    0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 
    0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 
    0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 
    0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 
    0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
    0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 
    0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 
    0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
    0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 
    0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 
    0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
    0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
    0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
    0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
    0x43, 0x83, 0x41, 0x81, 0x80, 0x40
    };
    
    unsigned int CrcSet(unsigned char *buffer,int num)
    {
       unsigned int index;
       unsigned char hi=0xff;
       unsigned char lo=0xff;
       while(num--)
       {
         index=hi^*buffer++;
         hi=lo^crchi[index];
         lo=crclo[index];
       }
       return (hi<<8 | lo);
    }
    
    int main()
    {
        int k;
        unsigned char str[20];
    
        str[0]=0x01;
        str[1]=0x03;
        str[2]=0x00;
        str[3]=0x06;
        str[4]=0x00;
        str[5]=0x01;
        str[6]=0x68;
        k=CrcSet(str,6);
          printf("%04x", k); /* 640b */
     return 0;
    }
    输出的结果是:
    640b

    2、自定义的校验方式

    具体应用场景可以选择合适的校验方式,在游戏服务器为了较好的程序效率,可使用自定义的校验方式:

    根据一个固定的key和一个变动的key来对缓冲数据的生成一个unsigned short的校验码,计算方式是对每个缓冲区的字节进行异或。

    参数解释:
    pBuffer 里的是数据,dwSize 是数据的长度,userKey是服务器分配的每个客户端不一样的用户码,这样就算出了一个校验码。

    代码如下:

    inline unsigned short calVerifyCode(const void* pBuffer, size_t dwSize, unsigned short userKey)
    {
    	unsigned short ret = 0xCE;
    	const unsigned char *pb = (const unsigned char*)pBuffer;
    	while (dwSize > 0)
    	{
    		ret ^= *pb;//循环冗余校验
    		dwSize--;
    		pb++;
    	}
    	ret ^= userKey;
    	return ret;
    }



    展开全文
  • 计算循环冗余校验码计算

    万次阅读 2015-07-07 09:44:18
    计算循环冗余校验码计算

    循环冗余校验码的计算是计算机组成原理的一大考点,具体算法如下:


    A、编码原理:   

                               现假设有:   有效信息:M   ;  

                   除数G(生成多项式)   有:   M/G=Q+R/G

                              此时,可选择R作为校验位,则MR即为校验码。

                             

    B、校验原理:  (M-R/G=Q+0/G   

                                说明:以接收到的校验码除以约定的除数,若余数为0,则可认为接收到的数据是正确的。

                         

                             例:有效信息1101,生成多项式样1011

                   求循环校验码解:  

                                             有效信息1101(k=4),即M(x)=x3+x2+x0    生成多项式1011(r+1=4,r=3),

                                                     G(x)=x3+x1+x0    M(x)·x3=x6+x5+x3,即1101000(对1101左移三位)   

                                            M(x)·x3/G(x)=1101000/1011=1111+001/1011    即1010CRC是:1101001

                           

                                                    如下图进行计算:

                

                                                    


                                            循环校验码的来源余数与出错序号间处理存在对应模式,

                                           该模式只与只与码制和生成多项式有关,与具体的码字无关。

                                            生成多项式满足的条件:任一位发生错误都应使余数不为0不同的位发生的错误余数应不同。


    展开全文
  • 若需要进一步了解线性码、分组码、循环码、纠错编码等方面的原理,可以阅读有关资料。利用CRC进行检错的过程可简单描述为:在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的r位监督 码(CRC码),...

    5d1201e9a455f446206af216ecb02ab8.png

    CRC的全称为Cyclic Redundancy Check,中文名称为

    差错控制理论是在代数理论基础上建立起来的。这里我们着于介绍CRC的算法与实现,对原理只能捎带说明一下。若需要进一步了解线性码、分组码、循环码、纠错编码等方面的原理,可以阅读有关资料。

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

    1 代数学的一般性算法

    在代数编码理论中,将一个码组表示为一个多项式,码组中各码元当作多项式的系数。例如 1100101 表示为

    1·x61·x50·x40·x31·x20·x1,即 x6x5x21。

    设编码前的原始信息多项式为P(x),P(x)的最高幂次加1等于k;生成多项式为G(x),G(x)的最高幂次等于r;CRC多项式为R(x);编码后的带CRC的信息多项式为T(x)。

    发送方编码方法:将P(x)乘以xr(即对应的二进制码序列左移r位),再除以G(x),所得余式即为R(x)。用公式表示为

    T(x)=xrP(x)R(x)

    接收方解码方法:将T(x)除以G(x),如果余数为0,则说明传输中无错误发生,否则说明传输有误。

    举例来说,设信息码为1100,生成多项式为1011,即P(x)=x3x2,G(x)=x3x1,计算CRC的过程为

    即 R(x)=x。注意到G(x)最高幂次r=3,得出CRC为010。

    如果用竖式除法,计算过程为

    因此,T(x)=(x6x5)(x)=x6x5x, 即 1100000010=1100010

    如果传输无误,

    无余式。回头看一下上面的竖式除法,如果被除数是1100010,显然在商第三个1时,就能除尽。

    上述推算过程,有助于我们理解CRC的概念。但直接编程来实现上面的算法,不仅繁琐,效率也不高。实际上在工程中不会直接这样去计算和验证CRC。

    下表中列出了一些见于标准的CRC资料:

    ISO HDLC, ITU X.25, V.34/V.41/V.42, PPP-FCS

    ZIP, RAR, IEEE 802 LAN/FDDI, IEEE 1394, PPP-FCS

    4.CRC算法的实现

    ---------------

    要用程序实现CRC算法,考虑对第2节的长除法做一下变换,依然是M = 11100110,G = 1011,

    其系数r为3。

    11001100

    ------------------------

    1011 )11100110000

    1011.......

    ----.......

    1010......

    1011......

    ----......

    1110...

    1011...

    ------...

    1010..

    1011..

    -------

    100

    本文来自电脑杂谈,转载请注明本文网址:

    http://www.pc-fly.com/a/tongxinshuyu/article-38614-1.html

    展开全文
  • CRC计算软件,是MODBUS计算循环冗余码的非常不错的工具
  • 详细循环冗余校验编码CRC计算方法,循环冗余校验编码计算方法。
  • 循环冗余校验在一些传输协议中,发送端并不指出消息长度,而是采用结束标志,考虑以下几种差错:1)在消息之前,增加1个或多个0字节;2)消息以1个或多个连续的0字节开始,丢掉1个或多个0;3)在消息(包括校验码)之后,...

    接收端对收到的len 2字节执行do_crc,如果没有差错发生则结果应为0。循环冗余校验

    在一些传输协议中,发送端并不指出消息长度,而是采用结束标志,考虑以下几种差错:

    1)在消息之前,增加1个或多个0字节;

    2)消息以1个或多个连续的0字节开始,丢掉1个或多个0;

    3)在消息(包括校验码)之后,增加1个或多个0字节;

    4)消息(包括校验码)以1个或多个连续的0字节结尾,丢掉1个或多个0;

    显然,这几种差错都检测不出来,其原因就是如果寄存器为0,处理0消息字节(或位),寄存器不变。为了解决前2个问题,只需寄存器的初非0即可,对do_crc作以下改进:

    unsigned short do_crc(unsigned short reg_init, unsigned char *message, unsigned int len)

    {

    unsigned short crc_reg = reg_init;

    while (len--)

    crc_reg = (crc_reg >> 8) ^ crc16_ccitt_table[(crc_reg ^ *message) & 0xff];

    return crc_reg;

    }

    在CRC16-CCITT标准中reg_init = 0xffff,为了解决后2个问题,在CRC16-CCITT标准中将计算出的校验码与0xffff进行异或,即:

    unsigned short code = do_crc(0xffff, message, len);

    code ^= 0xffff;

    message[len] = code & 0x00ff;

    message[len 1] = (code >> 8) & 0x00ff;

    显然,现在接收端对收到的所有字节执行do_crc,如果没有差错发生则结果应为某一常GOOD_CRC。其满足以下关系:

    unsigned char p[]= {0xff, 0xff};

    GOOD_CRC = do_crc(0, p, 2);

    其结果为GOOD_CRC = 0xf0b8。

    在同一程序中验证如下(放在main函数中可试验):

    unsigned char p[]= {0xa0,0xb0,0xff, 0xff};

    unsigned short crc;

    crc= do_crc(0xffff, p, 2); //计算前两位的CRC码

    crc^=0xffff; //对其取反

    p[2]=crc&0x00ff; //将计算的CRC码加到信息序列后面

    p[3]=crc>>8&0x00ff;

    printf("p[2]=%x,p3=%x\n",p[2],p[3]);

    crc=do_crc(0xffff,p,4); //对信息码+CRC码共同计算得出CRC=0xf0b8

    printf("crc is %x\n",crc);

    假设发送的信息是p[0],p[1];低位先发,对其计算的CRC加到信息码后面

    然后对信息码+CRC码共同计算CRC,此时应该是常数0xf0b8。不管信息码如何变化,内容和长度都可变,只要把计算的CRC码加进去一起计算CRC,就应该是得该常数GOOD_CRC。

    参考文献

    --------

    [1] Ross N. Williams,"A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS",Version 3,

    ,August 1993

    [2] Simpson, W., Editor, "PPP in HDLC Framing",RFC 1549, December 1993

    [3] P. E. Boudreau,W. C. Bergman and D. R. lrvin,"Performance of a cyclic redundancy check and its interaction with a data scrambler",IBM J. RES. DEVELOP.,VOL.38 NO.6,November 1994

    本文来自电脑杂谈,转载请注明本文网址:

    http://www.pc-fly.com/a/tongxinshuyu/article-38614-6.html

    展开全文
  • CRC循环冗余校验计算

    千次阅读 2017-05-21 09:44:51
    循环冗余校验(Cyclic Redundancy Check, CRC)是一种主要用来检测或校验数据传输过程中出现的错误,是一种常用且强大的检错方法,在数据块同步传输方式中都使用CRC检验。 特点:信息字段和校验字段的长度是任意的! ...
  • 计算循环冗余校验码

    2020-03-06 23:28:30
    计算循环冗余校验 现用除数P=1101对待发送序列101001做循环冗余校验,请给出校验码的计算过程。 在这里插入图片描述,感谢大佬的讲解让我一下子就懂了 ...
  • (给算法爱好者加星标,修炼编程内功)来源:Mr Bluyee概述循环冗余校验(Cyclic redundancy check,通称“CRC”)是一种根据网络数据数据包或计算机文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或...
  • CRC循环冗余计算

    2020-07-19 14:02:21
    算法分为3个部分:要发送的数据(或接收的数据)、生成多项式、FCS帧校验序列(冗余码)。它是利用除法及余数的原理来作错误侦测的。 抽象例子帮助理解 9除2等于了2余数是1。其中9就好像是要发送的数据,2就像生成...
  • 计算循环冗余码 Description 计算机网络中采用循环冗余码来校验数据的正确性。其原理是:发送方计算出待发送的二进制数据的循环冗余码,并随同原数据一起发送到接收方;接收方通过重新计算接收到的数据...
  • CRC循环冗余码及其详细计算

    千次阅读 2020-09-21 20:35:05
    文章目录循环冗余校验码的定义循环冗余校验码的特点什么是模2运算CRC码的计算具体怎么校验 循环冗余校验码的定义 循环冗余校验码由信息码n位和校验码k位构成。k位校验位拼接在n位数据位后面,n+k为循环冗余校验码的...
  • 计算循环冗余

    千次阅读 2008-02-20 23:46:00
    接收方通过重新计算接收到的数据的循环冗余码,并和收到的循环冗余码进行比较,如果两者相同则可判定所收到的数据是正确的,否则说明数据是错误的。其中计算二进制数据的循环冗余码的计算过程如下: >>协议事先约定...
  • 循环冗余校验码计算CRC

    万次阅读 2015-05-15 17:19:30
    循环冗余校验码,CRC
  • Problem 1078 计算循环冗余码 Accept: 493 Submit: 910 Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description 计算机网络中采用循环冗余码来校验数据的正确性。其原理是:发送方计算出待发送的二进制...
  • 二、CRC-16CRC-16计算步骤CRC-16 的计算方法有两种:查表法与计算法,在这里只讲述计算法。本人在 2000 年在江西亚东水泥公司上班时,在某电力仪表上的说明书中摘录下来的计算 CRC-16 步骤如下:1、 Load a 16-bit ...
  • 接收方通过重新计算接收到的数据的循环冗余码,并和收到的循环冗余码进行比较,如果两者相同则可判定所收到的数据是正确的,否则说明数据是错误的。其中计算二进制数据的循环冗余码的计算过程如下: 1.协议事先约定...
  • 循环冗余码(CRC)检错等 。奇偶校验码(PCC)根据被传输的一组二进制代码的数位中“1”的个数是奇数或偶数来进行校验。采用奇数的称为奇校验,反之,称为偶校验。采用何种校验是事先规定好的...
  • 接收方通过重新计算接收到的数据的循环冗余码,并和收到的循环冗余码进行比较,如果两者相同则可判定所收到的数据是正确的,否则说明数据是错误的。其中计算二进制数据的循环冗余码的计算过程如下: 1.协议事先约定...
  • CRC(循环冗余计算方法

    千次阅读 2019-01-01 14:20:26
  • 循环冗余校验码中冗余码的计算

    千次阅读 2019-06-24 22:55:04
    假设生成多项式为:g(x)=x4+x3+1;则对应g(x)的代码为: 11001 发送方:发出的传输字段为: 10110011010 接收方:使用相同的生成码进行校验:接收到的字段/生成码(二进制除法)...下面给出计算步骤: 1、 10110010000 ...
  • fjnu 1240 计算循环冗余

    千次阅读 2008-02-09 19:11:00
    接收方通过重新计算接收到的数据的循环冗余码,并和收到的循环冗余码进行比较,如果两者相同则可判定所收到的数据是正确的,否则说明数据是错误的。其中计算二进制数据的循环冗余码的计算过程如下: >>协议事先约定...
  • 界面化操作软件,可以进行8/16/24/32位循环冗余校验,支持查表计算和按位计算,支持生成查找表。注意待校验数据是按照msb的次序输入,即bit7先计算,bit0最后计算
  • 循环冗余校验码的基本思想和构造方法
  • 来源:CSDN作者:liyuanbhu写给嵌入式程序员的循环冗余校验(CRC)算法入门引导前言CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式。在嵌入式软件开发中,经常要用到CRC 算法对各种数据进行校验。因此,掌握...
  • CRC 循环冗余码的计算方法

    万次阅读 多人点赞 2019-12-19 12:58:32
    期末复习了,发现循环冗余码的计算方法老是忘,特此记录一下 计算步骤 计算冗余位的位数,即生成多项式的最高阶数 在信息位后补冗余位个数的0 将第二步的结果与生成多项式相除,这里采用的除法...
  • CRC 循环冗余校验码 的计算方法

    万次阅读 2017-12-06 10:24:29
    循环冗余校验CRC(Cyclical Redundancy Check)字段位于尾部,有32位,有时称为IEEE/ANSI标准的CRC32.要使用一个n位CRC监测 数据传输错误,被检查的消息首先要追加n位0形成一个扩展消息(使用模2除法)除以一个n+1...
  • 循环冗余校验码(CRC)计算源代码合集,里面包含了各种编程语言(包括C,C++,单片机等)CRC代码的实现
  • python 实现CRC(循环冗余)校验

    万次阅读 2020-09-01 19:45:07
    循环冗余校验码(CRC),简称循环码,是一种常用的、具有检错、纠错能力的校验码,在早期的通信中运用广泛。循环冗余校验码常用于外存储器和计算机同步通信的数据校验。奇偶校验码和海明校验码都是采用奇偶检测为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,086
精华内容 434
关键字:

循环冗余计算