求crc的calcrc函数

来源:互联网 发布:java同步锁和互斥锁 编辑:程序博客网 时间:2024/06/05 23:58
unsigned   int   CMIS_computerDlg::calcrc(   unsigned   char   *ptr,   int   count   )             //求crc的calcrc函数,ptr是指向字符数组的指针   
  { //count是求crc的数据个数,while循环的次数   
          int     i;   
  //unsigned   char   crc[2], *w;                             
  //crc[2]='\0';   
  unsigned   int   crc;                             //要返回的crc       16位的   
  unsigned   char   crc1, crc2, crc3;         //指向数组中连续的三个字符     8位的   
  crc1   =   *ptr++   ;   
  crc2   =   *ptr++   ;   
    
          while   (--count   >=   0)   {   
    
          crc3   =   *ptr++   ;                                       //在while中补充下一个字符(8个bit)   
                          for   (i   =   0;   i   <   8;   ++i)   
  {   
                                  if   (crc1   &   0x80)                             //判断crc1高位是否为1   
  {   
                                          crc1   =   crc1   <<   1;                   //移出高位   
  if(crc2   &   0x80)                       //判断crc2高位是否为1   
  {   
  crc1=crc1   |   0x01;           //crc1低位由0变1   
  }   
  crc2   =   crc2   <<   1;                   //移出高位   
  if(crc3   &   0x80)                       //判断crc3高位是否为1   
  {   
  crc2=crc2   |   0x01;           //crc2低位由0变1   
  }   
  crc3=crc3<<1;     //移出高位   
    
  crc1=crc1   ^   0x10;                   //前8bit与0x10异或   
  crc2=crc2   ^   0x21;                   //后8bit与0x21异或   
  }   
  else                                                     //如果crc1高位不是1,只移位致意不做异或   
  {                                                             
  crc1   =   crc1   <<   1;   
  if(crc2   &   0x80)   
  {   
  crc1=crc1   |   0x01;   
  }   
  crc2   =   crc2   <<   1;   
  if(crc3   &   0x80)   
  {   
  crc2=crc2   |   0x01;   
  }   
  crc3=crc3<<1;   
  }   
  }//for       
          }//while   
  crc=(crc1<<8)+crc2;                 //*********************8   
  return   crc;   
  }