基于C语言的CRC程序
#include <stdio.h>
#define u8 unsigned char
#define u16 unsigned short
u16 CRC16_IBM(u8 *msg, int msg_len);
u16 CRC16_USB(u8 *msg, int msg_len);
u16 CRC16_MAXIM(u8 *msg, int msg_len);
u16 CRC16_MODBUS(u8 *msg, int msg_len);
u16 CRC16_CCITT(u8 *msg, int msg_len);
u16 CRC16_CCITT_FALSE(u8 *msg, int msg_len);
u16 CRC16_X25(u8 *msg, int msg_len);
u16 CRC16_NDP(u8 *msg, int msg_len);
void CRC16_IBM_Q(u8 *msg, int msg_len);
u16 CRC16_XMODEM(u8 *msg, int msg_len);
u16 Q_CRC = 0x0000;
int main()
{
u8 a[] = {0x12,0x13,0x5};
u8 b[] = {0x14,0x15,0x55,0x45,0x89,0x56,0x1,0x6};
printf("CRC16_XMODEM = %x\n",CRC16_XMODEM(a,3));
return 0;
}
void CRC16_IBM_Q(u8 *msg, int msg_len)
{
u16 i, j, tmp;
for (i = 0; i < msg_len; i++)
{
Q_CRC ^= msg[i];
for (j = 0; j < 8; j++)
{
tmp = (u16)(Q_CRC & 0x0001);
Q_CRC >>= 1;
if (tmp == 1)
{
Q_CRC ^= 0xA001;
}
}
}
}
u16 CRC16_IBM(u8 *msg, int msg_len)
{
u16 i, j, tmp, CRC16;
CRC16 = 0x0000;
for (i = 0; i < msg_len; i++)
{
CRC16 ^= msg[i];
for (j = 0; j < 8; j++)
{
tmp = (u16)(CRC16 & 0x0001);
CRC16 >>= 1;
if (tmp == 1)
{
CRC16 ^= 0xA001;
}
}
}
return CRC16;
}
u16 CRC16_USB(u8 *msg, int msg_len)
{
u16 i, j, tmp, CRC16;
CRC16 = 0xFFFF;
for (i = 0; i < msg_len; i++)
{
CRC16 ^= msg[i];
for (j = 0; j < 8; j++)
{
tmp = (u16)(CRC16 & 0x0001);
CRC16 >>= 1;
if (tmp == 1)
{
CRC16 ^= 0xA001;
}
}
}
CRC16 ^= 0xFFFF;
return CRC16;
}
u16 CRC16_MAXIM(u8 *msg, int msg_len)
{
u16 i, j, tmp, CRC16;
CRC16 = 0x0000;
for (i = 0; i < msg_len; i++)
{
CRC16 ^= msg[i];
for (j = 0; j < 8; j++)
{
tmp = (u16)(CRC16 & 0x0001);
CRC16 >>= 1;
if (tmp == 1)
{
CRC16 ^= 0xA001;
}
}
}
CRC16 ^= 0xFFFF;
return CRC16;
}
u16 CRC16_MODBUS(u8 *msg, int msg_len)
{
u16 i, j, tmp, CRC16;
CRC16 = 0xFFFF;
for (i = 0; i < msg_len; i++)
{
CRC16 ^= msg[i];
for (j = 0; j < 8; j++)
{
tmp = (u16)(CRC16 & 0x0001);
CRC16 >>= 1;
if (tmp == 1)
{
CRC16 ^= 0xA001;
}
}
}
return CRC16;
}
u16 CRC16_CCITT(u8 *msg, int msg_len)
{
u16 i, j, tmp, CRC16;
CRC16 = 0x0000;
for (i = 0; i < msg_len; i++)
{
CRC16 ^= msg[i];
for (j = 0; j < 8; j++)
{
tmp = (u16)(CRC16 & 0x0001);
CRC16 >>= 1;
if (tmp == 1)
{
CRC16 ^= 0x8408;
}
}
}
return CRC16;
}
u16 CRC16_CCITT_FALSE(u8 *msg, int msg_len)
{
u16 i, j, tmp, CRC16,msg16;
CRC16 = 0xFFFF;
for (i = 0; i < msg_len; i++)
{
CRC16 ^= (msg[i] << 8);
for (j = 0; j < 8; j++)
{
tmp = (u16)((CRC16 & 0x8000) >> 15);
CRC16 <<= 1;
if (tmp == 1)
{
CRC16 ^= 0x1021;
}
}
}
return CRC16;
}
u16 CRC16_X25(u8 *msg, int msg_len)
{
u16 i, j, tmp, CRC16;
CRC16 = 0xFFFF;
for (i = 0; i < msg_len; i++)
{
CRC16 ^= msg[i];
for (j = 0; j < 8; j++)
{
tmp = (u16)(CRC16 & 0x0001);
CRC16 >>= 1;
if (tmp == 1)
{
CRC16 ^= 0x8408;
}
}
}
CRC16 ^= 0xFFFF;
return CRC16;
}
u16 CRC16_NDP(u8 *msg, int msg_len)
{
u16 i, j, tmp, CRC16;
CRC16 = 0x0000;
for (i = 0; i < msg_len; i++)
{
CRC16 ^= msg[i];
for (j = 0; j < 8; j++)
{
tmp = (u16)(CRC16 & 0x0001);
CRC16 >>= 1;
if (tmp == 1)
{
CRC16 ^= 0xA6BC;
}
}
}
CRC16 ^= 0xFFFF;
return CRC16;
}
u16 CRC16_XMODEM(u8 *msg, int msg_len)
{
u16 i, j, tmp, CRC16,msg16;
CRC16 = 0x0000;
for (i = 0; i < msg_len; i++)
{
CRC16 ^= (msg[i] << 8);
for (j = 0; j < 8; j++)
{
tmp = (u16)((CRC16 & 0x8000) >> 15);
CRC16 <<= 1;
if (tmp == 1)
{
CRC16 ^= 0x1021;
}
}
}
return CRC16;
}