计算CRC程序(CRC16)

#include <iostream.h>
#include <stdio.h>

typedef unsigned short u_short;
typedef unsigned char  u_char;

 

一。

//data_buf为报文串、data_length为报文串长度、
//crc_key为生成多项式(16位,去除最大位系数1)
//返回两字节校验码
u_short decCRC(u_char *data_buf,int data_length,u_short crc_key)
{
    u_short crc=0x0000,data_type=0x0000;
 int j=0;
    while(data_length>0)
 {    
        data_type=u_short((crc&0xff00)^(*data_buf<<8));
        for(j=0;j<8;j++)
        {
            if(data_type&0x8000)
            {
    data_type<<=1;    
    data_type^=crc_key;
            }
   else
   {
                data_type<<=1;
   }
        }
     crc<<=8;
     crc^=data_type;
  data_length--;
  data_buf++; 
 }
 return crc;
}

 

 

二。效率较高 


u_short crc16l(u_char *ptr,u_char len,u_short key)        // ptr 为数据指针,len 为数据长度
{
 u_char i;
 u_short crc=0x0000;
 while(len--)
 {
  for(i=0x80; i!=0; i>>=1)
  {
   if((crc&0x8000)!=0) {crc<<=1; crc^=key;}          
    else crc<<=1;                     
    if((*ptr&i)!=0) crc^=key;                        
  }
  ptr++;
 }
 return(crc);
}

 

 

 

!反转多项式是指在数据通讯时,信息字节先传送或接收低位字节,如重新排位影响 CRC
计算速度,故设反转多项式。!如CRC16  1021的反转多项式是8408

 

u_short crc16r(u_char *ptr, u_char len,u_short key)
{
 unsigned char i;
 u_short crc=0x0000;
 while(len--!=0)
 {
  for(i=0x01;i!=0;i <<= 1)
  {
   if((crc&0x0001)!=0) {crc >>= 1; crc ^= key;}
   else crc >>= 1;
   if((*ptr&i)!=0) crc ^= key;
  }
  ptr++;
 }
 return(crc);
}

 

 

你可能感兴趣的:(计算CRC程序(CRC16))