编辑代码

#include <stdio.h>

typedef unsigned char uchar;
typedef unsigned short uint;
typedef unsigned int ulong;
typedef unsigned char BYTE;

unsigned char buf[40] = {
    0xFA, 0xA5, 0x28, 0x01, 0x02, 0x00, 0x01, 
    0x06, //[7]
    0x00, //[8]
    0x00, //[9]
    0x00, //[10]
    0x00, //[11]
    0x00, //[12]
    0x00, //[13]
    0x00, //[14]
    0x10, //[15]
    0x2A, //[16]
    0x30, //[17]
    0x00, //[18]
    0x64, //[19]
    0x00, //[20]
    0x00, //[21]
    0x00, //[22]
    0x00, //[23]
    0x00, //[24]
    0x00, //[25]
    0x00, //[26]
    0x00, //[27]
    0x00, //[28]
    0x00, //[29]
    0x00, //[30]
    0x00, //[31]
    0x00, //[32]
    0x00, //[33]
    0x00, //[34]
    0x10, //[35]
    0x13, //[36]
    0x88, //[37]
    0x8D, 0xF2
};


unsigned char buf_25_data[25] = {
    0xFA, 0xA5, 0x19, 0x02, 0x01, 0x79, 0x00, 
    0xFA, //[7]
    0x00, //[8]
    0x00, //[9]
    0x00, //[10]
    0x00, //[11]
    0x00, //[12]
    0x00, //[13]
    0x00, //[14]
    0x00, //[15]
    0x00, //[16]
    0x00, //[17]
    0x00, //[18]
    0x00, //[19]
    0x00, //[20]
    0x00, //[21]
    0x00, //[22]
    0x00, //[23]
    0x00, //[24]
};

unsigned short CRC16CCITT(unsigned char * pszBuf, unsigned short unLength)
{

	unsigned short i, j;
	unsigned short CrcReg = 0xFFFF;
	unsigned short CurVal;

	for (i = 0; i < unLength; i++) 
	{
		CurVal = pszBuf[i] << 8;

		for (j = 0; j < 8; j++) 
		{ 
			if ((short)(CrcReg ^ CurVal) < 0)
				CrcReg = (CrcReg << 1) ^ 0x1021;
			else 
				CrcReg <<= 1; 
			CurVal <<= 1;            
		}
	}

	return CrcReg;
} 

unsigned short Crc16(unsigned char *U8_Data, unsigned char U8_DataLength)
{
    unsigned char U8_I;
    unsigned short U16_CRC;
    U16_CRC = 0;
    while (U8_DataLength--)
    {
        for (U8_I = 0x80; U8_I != 0; U8_I >>= 1)
        {
            if (U16_CRC & 0x8000)
            {
                U16_CRC <<= 1;
                U16_CRC ^= 0x1021;
            }
            else
            {
                U16_CRC <<= 1;
            }
            if ((*U8_Data) & U8_I)
            {
                U16_CRC ^= 0x1021;
            }
        }
        U8_Data++; 
    }
    return U16_CRC;
}

uint tool_calc_crc16(uchar *buf, uchar len)
{
	uchar i;
	uint crc = 0;

	while (len--)
	{
		for (i = 0x80; i != 0; i >>= 1)
		{
			if (crc & 0x8000)
			{
				crc <<= 1;
				crc ^= 0x1021;
			}
			else
			{
				crc <<= 1;
			}
			if ((*buf) & i)
			{
				crc ^= 0x1021;
			}
		}
		buf++;
	}
	
	return crc;
}
uchar data_buf40[] = {0xFA,0xA5,0x28,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x2A,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x2A,0x30,0x00,0x00,0x00,0x18,0x0A,0x64,0x56,0x7A};
uchar data_buf25[] = {0xFA,0xA5,0x19,0x02,0x01,0x79,0x00,0xFA,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0xF8};
int main () {
    //JSRUN引擎2.0,支持多达30种语言在线运行,全仿真在线交互输入输出。 
    printf("CRC16:%x\n", Crc16(buf, 38));
    printf("CRC16CCITT:%x\n", CRC16CCITT(buf, 38));
    printf("tool_calc_crc16:%x\n", tool_calc_crc16(data_buf40, 38));
    buf[38] = Crc16(buf, 38) >> 8;
    buf[39] = Crc16(buf, 38) ;
    printf("DATA: ");
    for (unsigned char i = 0; i < 40; i++)
    {
        if(buf[i] < 0x10) printf("0"); 
        printf("%x ", buf[i]);
    }
    printf("\n");
    printf("CRC16-25:%x\n", Crc16(buf_25_data, 23));
    printf("tool_calc_crc16:%x\n", tool_calc_crc16(data_buf25, 23));
    data_buf25[23] = tool_calc_crc16(data_buf25, 23) >> 8;
    data_buf25[24] = tool_calc_crc16(data_buf25, 23) ;
    printf("DATA: ");
    for (unsigned char i = 0; i < 25; i++)
    {
        if(data_buf25[i] < 0x10) printf("0"); 
        printf("%x ", data_buf25[i]);
    }
    printf("\n");

    return 0;
}