//=============================================<br />// 关于CRC计算,到网上一搜,**一大把。经整理,得到如下几段代码。<br />// 用这几个函数算出来的值是不同的.其中1和2只是反转的关系。<br />// 按照对crc16的定义,只应存在两种算法。<br />// 那么3和4怎么理解?<br />// 代码3生成的CRC和MODEBUS协议吻合。<br />// 本人愚蠢,请指教<br />//=============================================<br />// 参数说明: 指针、数据长度、初值、多项式<br />//=============================================<br />// Description: Calc CRC16.<br />// Para: pointer of data. length of data, Init value, Poly<br />// return: result<br />//=============================================<br />unsigned int CRC16_1( unsigned char * puchMsg, <br /> unsigned int usDataLen, <br /> unsigned int CrcInit, <br /> unsigned int Ploy ) <br />{<br /> unsigned int crc;<br /> unsigned char i;<br /><br /> crc = CrcInit;<br /> <br /> while( usDataLen-- )<br /> {<br /> for( i = 0x80; i != 0; i /= 2 )<br /> {<br /> if( ( crc & 0x8000 ) != 0 )<br /> {<br /> crc <<= 1; <br /> crc ^= Ploy;<br /> }<br /> else<br /> crc <<= 1;<br /> if( * puchMsg & i )<br /> crc ^= Ploy; <br /> }<br /> puchMsg++;<br /> }<br /> return( crc );<br />}<br />//=============================================<br />// Description: Calc CRC16.<br />// Para: pointer of data. length of data, Init value, Poly<br />// return: result<br />//=============================================<br />unsigned int CRC16_2( unsigned char * puchMsg, <br /> unsigned int usDataLen,<br /> unsigned int CrcInit,<br /> unsigned int Ploy ) <br />{<br /> unsigned int crc;<br /> unsigned char i;<br /><br /> crc = CrcInit;<br /> <br /> while( usDataLen-- )<br /> {<br /> for( i = 0x01; i != 0; i *= 2 )<br /> {<br /> if( ( crc & 0x0001 ) != 0 )<br /> {<br /> crc >>= 1; <br /> crc ^= Ploy;<br /> }<br /> else<br /> crc >>= 1;<br /> if( * puchMsg & i )<br /> crc ^= Ploy;<br /> }<br /> puchMsg++;<br /> }<br /> return( crc );<br />}<br />//=============================================<br />// Description: Calc CRC16.<br />// Para: pointer of data. length of data, Init value, Poly<br />// return: result<br />//=============================================<br />unsigned int CRC16_3( unsigned char * puchMsg,<br /> unsigned int usDataLen, <br /> unsigned int CrcInit, <br /> unsigned int Ploy ) <br />{<br /> unsigned int Crc;<br /> int i = 0; <br /> unsigned char j = 0;<br /><br /> Crc = CrcInit;<br /> <br /> for( i = 0; i < usDataLen; i++ )<br /> { <br /> Crc ^= puchMsg;<br /> for( j = 0; j < 8; j++ )<br /> { <br /> if( Crc & 0x0001 )<br /> {<br /> Crc >>= 1;<br /> Crc ^= Ploy;<br /> }<br /> else<br /> {<br /> Crc >>= 1;<br /> }<br /> }<br /> }<br /> return ( Crc );<br />}<br />//=============================================<br />// Description: Calc CRC16.<br />// Para: pointer of data. length of data, Init value, Poly<br />// return: result<br />//=============================================<br />unsigned int CRC16_4( unsigned char * puchMsg,<br /> unsigned int usDataLen,<br /> unsigned int CrcInit,<br /> unsigned int Ploy ) <br />{<br /> unsigned int Crc;<br /> int i = 0; <br /> unsigned char j = 0;<br /><br /> Crc = CrcInit;<br /> <br /> for( i = 0; i < usDataLen; i++ )<br /> { <br /> Crc ^= puchMsg;<br /> for( j = 0; j < 8; j++ )<br /> { <br /> if( Crc & 0x0001 )<br /> {<br /> Crc >>= 1;<br /> Crc ^= Ploy;<br /> }<br /> else<br /> {<br /> Crc >>= 1;<br /> }<br /> }<br /> }<br /> return ( Crc );<br />}<br />//============================================= |
|