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;
}