有一设备的是用 CRC为16位循环冗余校验码,生成多项式为:G(X)=X16+X15+X13+1
比如
   41 30 30 31 04 32 37 30 30 5A  他的校验位是86 C7不知道这个校验程序是怎么写的

解决方案 »

  1.   

    CRC(Cyclic Redundancy Check)循环冗余校验码
      是常用的校验码,在早期的通信中运用广泛,因为早期的通信技术不够可靠(不可靠性的来源是通信技术决定的,比如电磁波通信时受雷电等因素的影响),不可靠的通信就会带来‘确认信息’的困惑,书上提到红军和蓝军通信联合进攻山下的敌军的例子,第一天红军发了条信息要蓝军第二天一起进攻,蓝军收到之后,发一条确认信息,但是蓝军担心的是‘确认信息’如果也不可靠而没有成功到达红军那里,那自己不是很危险?于是红军再发一条‘对确认的确认信息’,但同样的问题还是不能解决,红军仍然不敢冒然行动。  对通信的可靠性检查就需要‘校验’,校验是从数据本身进行检查,它依靠某种数学上约定的形式进行检查,校验的结果是可靠或不可靠,如果可靠就对数据进行处理,如果不可靠,就丢弃重发或者进行修复。  CRC码是由两部分组成,前部分是信息码,就是需要校验的信息,后部分是校验码,如果CRC码共长n个bit,信息码长k个bit,就称为(n,k)码。 它的编码规则是:
      1、首先将原信息码(kbit)左移r位(k+r=n)
      2、运用一个生成多项式g(x)(也可看成二进制数)用模2除上面的式子,得到的余数就是校验码。  非常简单,要说明的:模2除就是在除的过程中用模2加,模2加实际上就是我们熟悉的异或运算,就是加法不考虑进位,公式是:
      0+0=1+1=0,1+0=0+1=1
    即‘异’则真,‘非异’则假。
      由此得到定理:a+b+b=a 也就是‘模2减’和‘模2加’直值表完全相同。  有了加减法就可以用来定义模2除法,于是就可以用生成多项式g(x)生成CRC校验码。例如: g(x)=x4+x3+x2+1,(7,3)码,信息码110产生的CRC码就是:
                 101
    11101 | 110,0000
            111 01
              1 0100
              1 1101
                1001
    余数是1001,所以CRC码是110,1001标准的CRC码是,CRC-CCITT和CRC-16,它们的生成多项式是:
      CRC-CCITT=x16+x12+x5+1
      CRC-16=x16+x15+x2+1引用自:http://www.programfan.com/blog/article.asp?id=11042
      

  2.   

    给你一个写好的  嘿嘿
    unsigned   short CReadDateDlg::CRC16(unsigned char *data, unsigned char length)
    {
        unsigned   short   reg_crc;                     
    unsigned   short   s_crcchk;                     
    s_crcchk   =   0;               
    reg_crc   =   0xffff; 
    while(length--) 

    reg_crc   ^=   *data++; 
    for(s_crcchk   =   0;   s_crcchk   <   8;   s_crcchk   ++) 

    if(reg_crc   &   0x01) 

    reg_crc   =   (reg_crc   >>   1)^0xa001; 

    else 

    reg_crc   =   reg_crc   >>   1; 



    return   reg_crc; 
    }
      

  3.   

    引用的时候只需在要调用的程序中添加如下代码
             unsigned   int   uiCRC; 
            BYTE bCommand[17];//校验的数组
             BYTE  str[2] ;//存放校验值
    uiCRC   =   CRC16(bCommand,17);     //CRC16校验 
    str[0]   =   uiCRC/0x100; //其中一个检验值
    str[1]   =   uiCRC%0x100; //另一个校验值
      

  4.   

     BYTE bCommand[17];//校验的数组 
    数组大小你可以随便修改
      

  5.   

    http://topic.csdn.net/u/20071226/09/22c68929-adb1-4739-add5-75915351d0f0.html这是我当初学CRC-16的时候的帖子
      

  6.   

    恩,还是没怎么看明白  G(X)=X16+X15+X13+1多相式的值是不是0xa001