1. 程式人生 > >關於校驗和計算方面的C++程式碼,哪位大俠幫忙解讀一下,小弟初學,不太懂!謝謝!

關於校驗和計算方面的C++程式碼,哪位大俠幫忙解讀一下,小弟初學,不太懂!謝謝!

關於校驗和計算方面的C++程式碼,哪位大俠幫忙解讀一下,小弟初學,不太懂!謝謝!

2010-09-03 16:51 李志鵬6076  |  瀏覽 755 次
#include "stdafx.h"
#include "CheckSum.h"

#define CHECKVALUE(pt,nl) if((btData==NULL)||(nLength<=0)){AfxMessageBox("無效陣列!");return -1;}

CCheckSum::CCheckSum()
{

}

CCheckSum::~CCheckSum()
{

}
//CCITT V.41,x16 + x12 + x5 + 1
WORD CCheckSum::CCITT_CRC_16(BYTE* btData,int nLength)
{
 CHECKVALUE(btData,nLength);
 WORD CRC=0;
 BYTE j;
 int i;

    for(i=0;i<nLength;i++)
    {     
        CRC^=(btData[i]<<8);
  for (j=0;j<8;j++)
  {
   if(CRC&0x8000)CRC=((CRC<<1)^0x1021);
   else          CRC<<=1;
  }
    }
 return ((CRC>>8)+(CRC<<8));/* 應用時低在先 */
}
//ANSI CRC-16,x16 + x15 + x2 + 1
WORD CCheckSum::ANSI_CRC_16(BYTE* btData,int nLength)
{
 CHECKVALUE(btData,nLength);
 WORD CRC=0xFFFF;
 BYTE j,Tmp=0;
 int i;

    for(i=0;i<nLength;i++)
    {     
  CRC^=btData[i];                      
  for (j=0;j<8;j++)                    
  {                                    
   Tmp=CRC&0x0001;              
   CRC=CRC>>1;                  
   if(Tmp)CRC=(CRC^0xA001);     
  }                                    
    }
 return ((CRC>>8)+(CRC<<8)); /* 應用時高在先 */
}
如果嫌多的話,那就請詳細的解釋一下WORD CCheckSum::CCITT_CRC_16(BYTE* btData,int nLength)
{
 CHECKVALUE(btData,nLength);
 WORD CRC=0;
 BYTE j;
 int i;

    for(i=0;i<nLength;i++)
    {     
        CRC^=(btData[i]<<8);
  for (j=0;j<8;j++)
  {
   if(CRC&0x8000)CRC=((CRC<<1)^0x1021);
   else          CRC<<=1;
  }
    }
 return ((CRC>>8)+(CRC<<8));/* 應用時低在先 */
}
這一小段吧!包括它的邏輯關係,謝謝!
2010-09-03 19:03 提問者採納
哪裡不懂? 
補充點操作符:

1) |按位或操作符:result=exp1|exp2;當exp1和exp2中對應位中至少有一個為1時,result中對應位為1,否則為0。
2) &  按位與操作符::result=exp1&exp2;當exp1和exp2中對應位全為1時,result中對應位為1,否則為0。
3)^  按位異或操作符:result=exp1^exp2;當exp1和exp2中對應位不相同時,result中對應位為1,否則為0。  
4)~  反轉操作符:將位容器中的所有位都反轉,1變為0,0變為1。
5)<< 按位左移操作符:exp<<n,將容器中所有的位向左移n位,空出的位用0填充。
6) p>> 按位右移操作符:exp>>n,將容器中所有的位向右移n位,空出的位用0填充。
7)|=,&=,^= 分別對應|&^三種操作符的複合操作符。