在线等,求一个用C语言写的CRC-16位校验的WIN32控制台程序,非查表法

要求,能输入8位数字 然后算出来CRC-16校验码 ,显示其高8位和低8位,先感谢下,下午作业 求效率啊 要不死定了
#include <stdio.h>

typedef unsigned short ushort;
typedef unsigned char uchar;

typedef union _CRC
{
ushort crc16;
uchar by[2];
} CRC;

//输入不带CRC码的数据时,返回值是CRC码
//输入带CRC码的数据时,则可以进行校验早悄,返回0时CRC校验成功,否则CRC校验失败
ushort CRC16(uchar *ba, int size)
{
CRC crc;
crc.crc16 = 0xffff;
int i, l;
for (i=0; i<size; i++)
{
uchar ch = ba[i];
crc.by[0] = crc.by[0] ^ ch;
for (l=0; l<8; l++)
{
if (crc.by[0] & 0x01)
{
crc.crc16 = crc.crc16 >> 1;
crc.crc16 = crc.crc16 ^ 0xa001;
}
else
{
crc.crc16 = crc.crc16 >> 1;
}
}
}
uchar swap = crc.by[0];
crc.by[0] = crc.by[1];
crc.by[1] = swap;
return crc.crc16;
}

void main()
{
uchar ba[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
CRC crc;
//计算CRC码颤睁丛
crc.crc16 = CRC16(ba, 8);
printf("高字节:0x%x, 低字节:0x%x\n", crc.by[1], crc.by[0]);
//CRC校验
uchar bb[10] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0xb0, 0xcf};
if (0 == CRC16(bb, 10))
{
printf("bb 校验成功!"茄樱);
}
else
{
printf("bb 校验失败!");
}
}