typedef unsigned char UCHAR;
typedef unsigned char BOOL;
/* 计算cnt字节数据的crc,最后一个字节的低7比特必须是0,实际上求的是(cnt×8-1)比特数据的crc */
UCHAR CRC7_Cal(UCHAR *pSrc, UINT32 cnt);
UCHAR CRC7_Cal(UCHAR *pSrc, UINT32 cnt)
{
UCHAR crc7 = 0x89; // 除数多项式为G(X) = X^7 + X^3 + 1。
UINT8 count = 0; // 记录已经取了多少位数到余数中。
UINT8 temp1 = 0;
UINT8 temp2 = 0;
UCHAR crc = pSrc[0]; // 余数。
count = 8;
/* 求余数crc */
while(count < cnt * 8)
{
/* 去掉余数中最高位0 */
temp1 = crc & 0x80;
while(0 == temp1)
{
crc = (crc << 1) & 0xfe;
temp2 = pSrc[count / 8];
temp2 = (temp2 >> (7 - (count % 8))) & 0x01;
crc = crc | temp2;
temp1 = crc & 0x80;
count++; // 更新计数
if(count == cnt * 8)
{
break;
}
}
if((count == cnt * 8) && (0 == temp1))
{
break;
}
crc = crc ^ crc7; // 模2除法
}
return crc;
}