unsigned char cal_table_high_first(unsigned char value)
{
unsigned char i, crc;
crc = value;
/* 数据往左移了8位,需要计算8次 */
for (i=8; i>0; --i)
{
if (crc & 0x80) /* 判断最高位是否为1 */
{
/* 最高位为1,不需要异或,往左移一位,然后与0x31异或 */
/* 0x31(多项式:x8+x5+x4+1,100110001),最高位不需要异或,直接去掉 */
crc = (crc << 1) ^ 0x31; }
else
{
/* 最高位为0时,不需要异或,整体数据往左移一位 */
crc = (crc << 1);
}
}
return crc;
}
unsigned char cal_table_low_first(unsigned char value)
{
unsigned char i, crc;
crc = value;
/* 同样需要计算8次 */
for (i=8; i>0; --i)
{
if (crc & 0x01) /* 反序异或变成判断最低位是否为1 */
/* 数据变成往右移位了 */
/* 计算的多项式从0x31(0011 0001)变成了0x8C (1000 1100) */
/* 多项式值,原来的最高位变成了最低位,原来的最低位变成最高位,8位数据高低位交换一下位置 */
crc = (crc >> 1) ^ 0x8C;
else
crc = (crc >> 1);
}
return crc;
}
void create_crc_table(void)
{
unsigned short i;
unsigned char j;
for (i=0; i<=0xFF; i++)
{
if (0 == (i%16))
TRACE("\n");
j = i&0xFF;
TRACE( "%d, \r\n", cal_table_low_first (j) ); /*依次计算每个字节的crc校验值*/
}
}