计算CRC程序(CRC16)

原文链接:http://blog.csdn.net/zhangqc1985/article/details/2955975

#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); 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值