CRC(转......)

代码
#include <iostream>

#define CRC_CCITT 0x1021    //CRC-CCITT多项式
using namespace std;

unsigned 
int crc_ta_8[256]=/* CRC 字节余式表 */
    
0x00000x10210x20420x30630x40840x50a50x60c60x70e7,
    
0x81080x91290xa14a0xb16b0xc18c0xd1ad0xe1ce0xf1ef,
    
0x12310x02100x32730x22520x52b50x42940x72f70x62d6,
    
0x93390x83180xb37b0xa35a0xd3bd0xc39c0xf3ff0xe3de,
    
0x24620x34430x04200x14010x64e60x74c70x44a40x5485,
    
0xa56a0xb54b0x85280x95090xe5ee0xf5cf0xc5ac0xd58d,
    
0x36530x26720x16110x06300x76d70x66f60x56950x46b4,
    
0xb75b0xa77a0x97190x87380xf7df0xe7fe0xd79d0xc7bc,
    
0x48c40x58e50x68860x78a70x08400x18610x28020x3823,
    
0xc9cc0xd9ed0xe98e0xf9af0x89480x99690xa90a0xb92b,
    
0x5af50x4ad40x7ab70x6a960x1a710x0a500x3a330x2a12,
    
0xdbfd0xcbdc0xfbbf0xeb9e0x9b790x8b580xbb3b0xab1a,
    
0x6ca60x7c870x4ce40x5cc50x2c220x3c030x0c600x1c41,
    
0xedae0xfd8f0xcdec0xddcd0xad2a0xbd0b0x8d680x9d49,
    
0x7e970x6eb60x5ed50x4ef40x3e130x2e320x1e510x0e70,
    
0xff9f0xefbe0xdfdd0xcffc0xbf1b0xaf3a0x9f590x8f78,
    
0x91880x81a90xb1ca0xa1eb0xd10c0xc12d0xf14e0xe16f,
    
0x10800x00a10x30c20x20e30x50040x40250x70460x6067,
    
0x83b90x93980xa3fb0xb3da0xc33d0xd31c0xe37f0xf35e,
    
0x02b10x12900x22f30x32d20x42350x52140x62770x7256,
    
0xb5ea0xa5cb0x95a80x85890xf56e0xe54f0xd52c0xc50d,
    
0x34e20x24c30x14a00x04810x74660x64470x54240x4405,
    
0xa7db0xb7fa0x87990x97b80xe75f0xf77e0xc71d0xd73c,
    
0x26d30x36f20x06910x16b00x66570x76760x46150x5634,
    
0xd94c0xc96d0xf90e0xe92f0x99c80x89e90xb98a0xa9ab,
    
0x58440x48650x78060x68270x18c00x08e10x38820x28a3,
    
0xcb7d0xdb5c0xeb3f0xfb1e0x8bf90x9bd80xabbb0xbb9a,
    
0x4a750x5a540x6a370x7a160x0af10x1ad00x2ab30x3a92,
    
0xfd2e0xed0f0xdd6c0xcd4d0xbdaa0xad8b0x9de80x8dc9,
    
0x7c260x6c070x5c640x4c450x3ca20x2c830x1ce00x0cc1,
    
0xef1f0xff3e0xcf5d0xdf7c0xaf9b0xbfba0x8fd90x9ff8,
    
0x6e170x7e360x4e550x5e740x2e930x3eb20x0ed10x1ef0
};

unsigned 
int crc_ta_4[16]=/* CRC 半字节余式表 */
    
0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
    
0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,
};
/*CRC算法一,适用于程序空间苛刻但CRC计算速度要求不高的微控制系统
        算法概要说明:计算本位后的CRC 码等于上一位CRC 码乘以2 后除
    以多项式,所得的余数再加上本位值除以多项式所得的余数
*/

/*函数名称:crc_cal_by_bit;按位计算CRC
  函数参数:unsigned char* ptr;指向发送缓冲区的首字节
            unsigned char len;要发送的总字节数
  函数返回值:unsigned int
  多项式采用CRC-CCITT 0x1021
*/
unsigned 
int crc_cal_by_bit(unsigned char* ptr, unsigned char len)
{
    unsigned 
int crc = 0;
    
while(len-- != 0)
    {
        
for(unsigned char i = 0x80; i != 0; i /= 2)
        {
            crc 
*= 2;
            
if((crc&0x10000!=0//上一位CRC乘 2后,若首位是1,则除以 0x11021
                crc ^= 0x11021;

            
if((*ptr&i) != 0)    //如果本位是1,那么CRC = 上一位的CRC + 本位/CRC_CCITT
                crc ^= CRC_CCITT;
        }
        ptr
++;
    }
    
return crc;
}




/*CRC算法二,适用于程序空间较大且CRC计算速度要求较高的计算机或微控制系统
        算法概要说明:计算本字节后的CRC 码等于上一字节余式CRC码的低8位左移8位后,
    再加上上一字节CRC 右移8 位(也既取高8 位)和本字节之和后所求得的CRC码
*/
/*函数名称:crc_cal_by_byte;按字节计算CRC
  函数参数:unsigned char* ptr:指向发送缓冲区的首字节
            unsigned char len:要发送的总字节数
  函数返回值:unsigned int
  多项式采用CRC-CCITT 0x1021
*/
unsigned 
int crc_cal_by_byte(unsigned char* ptr, unsigned char len)
{
    unsigned 
short crc = 0;

    
while(len-- != 0)
    {
        unsigned 
int high = (unsigned int)(crc/256); //取CRC高8位
        crc <<= 8;
        crc 
^= crc_ta_8[high^*ptr];
        ptr
++;
    }

    
return crc;
}


/*CRC算法三,适用于程序空间不太大且CRC计算速度又不可以太慢的微控制系统*/
/*函数名称:crc_cal_by_halfbyte:按半字节计算CRC
  函数参数:unsigned char* ptr:指向发送缓冲区的首字节
            unsigned char len:要发送的总字节数
  函数返回值:unsigned int
  多项式采用CRC-CCITT  0x1021
*/
unsigned 
int crc_cal_by_halfbyte(unsigned char* ptr, unsigned char len)
{
    unsigned 
short crc = 0;

    
while(len-- != 0)
    {
        unsigned 
char high = (unsigned char)(crc/4096); //暂存CRC的高4位
        crc <<= 4;
        crc 
^= crc_ta_4[high^(*ptr/16)];

        high 
= (unsigned char)(crc/4096);
        crc 
<<= 4;
        crc 
^= crc_ta_4[high^(*ptr&0x0f)];

        ptr
++;
    }

    
return crc;
}

//unsigned short 最大是65535
int main()
{
    unsigned 
char ptr[] = {0xa00xa00xa0};
    cout 
<< crc_cal_by_bit(ptr, 3<< '\n';
    cout 
<< crc_cal_by_halfbyte(ptr, 3<< '\n';
    cout 
<< crc_cal_by_byte(ptr, 3<< '\n';
}

 

posted @ 2010-01-12 14:35  独奏者  阅读(739)  评论(0编辑  收藏  举报