NJ8888 发表于 2012-3-26 09:39:37

申请置酷之八: 原创 CRC计算,包含逐位(用于非整8位)

和查表(两种多项式)

unsigned int G_crc;
unsigned char G_moduarray[];

#if 1                                                                //多项式1021
const unsigned short crc_ta={               /* CRC余式表 */
    0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
    0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,
    0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6,
    0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de,
    0x2462,0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485,
    0xa56a,0xb54b,0x8528,0x9509,0xe5ee,0xf5cf,0xc5ac,0xd58d,
    0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,0x46b4,
    0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc,
    0x48c4,0x58e5,0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823,
    0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,0x9969,0xa90a,0xb92b,
    0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12,
    0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a,
    0x6ca6,0x7c87,0x4ce4,0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41,
    0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,0x8d68,0x9d49,
    0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70,
    0xff9f,0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78,
    0x9188,0x81a9,0xb1ca,0xa1eb,0xd10c,0xc12d,0xf14e,0xe16f,
    0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046,0x6067,
    0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e,
    0x02b1,0x1290,0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256,
    0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,0xe54f,0xd52c,0xc50d,
    0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405,
    0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c,
    0x26d3,0x36f2,0x0691,0x16b0,0x6657,0x7676,0x4615,0x5634,
    0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,0xb98a,0xa9ab,
    0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3,
    0xcb7d,0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a,
    0x4a75,0x5a54,0x6a37,0x7a16,0x0af1,0x1ad0,0x2ab3,0x3a92,
    0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,0x8dc9,
    0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1,
    0xef1f,0xff3e,0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8,
    0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0x0ed1,0x1ef0
                                                        };

#endif
#if 0                                        //多项式8005
const unsigned int crc_ta={                                                       
                0x0000,0x8005,0x800F,0x000A,0x801B,0x001E,0x0014,0x8011,
                0x8033,0x0036,0x003C,0x8039,0x0028,0x802D,0x8027,0x0022,
                0x8063,0x0066,0x006C,0x8069,0x0078,0x807D,0x8077,0x0072,
                0x0050,0x8055,0x805F,0x005A,0x804B,0x004E,0x0044,0x8041,
                0x80C3,0x00C6,0x00CC,0x80C9,0x00D8,0x80DD,0x80D7,0x00D2,
                0x00F0,0x80F5,0x80FF,0x00FA,0x80EB,0x00EE,0x00E4,0x80E1,
                0x00A0,0x80A5,0x80AF,0x00AA,0x80BB,0x00BE,0x00B4,0x80B1,
                0x8093,0x0096,0x009C,0x8099,0x0088,0x808D,0x8087,0x0082,
                0x8183,0x0186,0x018C,0x8189,0x0198,0x819D,0x8197,0x0192,
                0x01B0,0x81B5,0x81BF,0x01BA,0x81AB,0x01AE,0x01A4,0x81A1,
                0x01E0,0x81E5,0x81EF,0x01EA,0x81FB,0x01FE,0x01F4,0x81F1,
                0x81D3,0x01D6,0x01DC,0x81D9,0x01C8,0x81CD,0x81C7,0x01C2,
                0x0140,0x8145,0x814F,0x014A,0x815B,0x015E,0x0154,0x8151,
                0x8173,0x0176,0x017C,0x8179,0x0168,0x816D,0x8167,0x0162,
                0x8123,0x0126,0x012C,0x8129,0x0138,0x813D,0x8137,0x0132,
                0x0110,0x8115,0x811F,0x011A,0x810B,0x010E,0x0104,0x8101,
                0x8303,0x0306,0x030C,0x8309,0x0318,0x831D,0x8317,0x0312,
                0x0330,0x8335,0x833F,0x033A,0x832B,0x032E,0x0324,0x8321,
                0x0360,0x8365,0x836F,0x036A,0x837B,0x037E,0x0374,0x8371,
                0x8353,0x0356,0x035C,0x8359,0x0348,0x834D,0x8347,0x0342,
                0x03C0,0x83C5,0x83CF,0x03CA,0x83DB,0x03DE,0x03D4,0x83D1,
                0x83F3,0x03F6,0x03FC,0x83F9,0x03E8,0x83ED,0x83E7,0x03E2,
                0x83A3,0x03A6,0x03AC,0x83A9,0x03B8,0x83BD,0x83B7,0x03B2,
                0x0390,0x8395,0x839F,0x039A,0x838B,0x038E,0x0384,0x8381,
                0x0280,0x8285,0x828F,0x028A,0x829B,0x029E,0x0294,0x8291,
                0x82B3,0x02B6,0x02BC,0x82B9,0x02A8,0x82AD,0x82A7,0x02A2,
                0x82E3,0x02E6,0x02EC,0x82E9,0x02F8,0x82FD,0x82F7,0x02F2,
                0x02D0,0x82D5,0x82DF,0x02DA,0x82CB,0x02CE,0x02C4,0x82C1,
                0x8243,0x0246,0x024C,0x8249,0x0258,0x825D,0x8257,0x0252,
                0x0270,0x8275,0x827F,0x027A,0x826B,0x026E,0x0264,0x8261,
                0x0220,0x8225,0x822F,0x022A,0x823B,0x023E,0x0234,0x8231,
                0x8213,0x0216,0x021C,0x8219,0x0208,0x820D,0x8207,0x0202
                                                                };
#endif

//通过计算方式,计算多项式=1021的数据串CRC,输入数据放在G_moduarray[]中,每个空间放1位,
//cal_number代表需要计算的位数.适合非整8位的CRC计算
//输入前,G_crc内容=1111111111111111;
//也可结合整8查表计算剩余的不足8的数据,,但G_crc内容要配置为前面查表计算的结果
//本计算根据1021多项式配置,如果是8005需要重新仿照编写
void CRC16(unsigned int cal_number)
{
        unsigned int temp,loop;
        for (loop=0;loop<16;loop++)
                G_crc=0x0001;
        for (loop=0;loop<cal_number;loop++)
        {
                temp=G_crc;
                G_crc=G_crc;
                G_crc=G_crc;
                G_crc=G_crc;
                if (G_moduarray==0)
                        G_crc=G_crc ^ temp;
                else
                        G_crc=G_crc ^ (0x0001 ^ temp);
                G_crc=G_crc;
                G_crc=G_crc;
                G_crc=G_crc;
                G_crc=G_crc;
                G_crc=G_crc;
                G_crc=G_crc;
                if (G_moduarray==0)
                        G_crc=G_crc ^ temp;
                else
                        G_crc=G_crc ^ (0x0001 ^ temp);
                G_crc=G_crc;
                G_crc=G_crc;
                G_crc=G_crc;
                G_crc=G_crc;
                if (G_moduarray==0)
                        G_crc=temp;
                else
                        G_crc=0x0001 ^ temp;
        }
       
        for (loop=0;loop<16;loop++)
                G_crc^=0x0001;
               
}

//查表计算CRC
unsigned short CalCrc(unsigned char *ptr,unsigned int len,unsigned short crcvalue)
{
        unsigned int temp,loop;
        for (loop=0;loop<len;loop++)
        {
                temp=crcvalue;
                crcvalue=crc_ta[((temp>>8)^*ptr) & 0xff] ^(temp<<8) ;
                ptr++;
        }
        return(crcvalue);
}
页: [1]
查看完整版本: 申请置酷之八: 原创 CRC计算,包含逐位(用于非整8位)