📄 crcbuildtable.c
字号:
/****************************************************************************************
*文件名:crcBuildTable.c COPYRIGHT(C) JINYANLAI
* All Rights Reserved
*说明:根据crc.h中选择的CRC校验生成256项CRC表.
=========================================================================================
*版本历史
=========================================================================================
*版本 *时间 *作者 *更改标记 *更改说明
*---- *---- *---- *------- *--------
* 0.1 *20061116 *敬恒 *无 *无
****************************************************************************************/
#include "includes.h"
#if !(USE_CRC_BITS >= 1) //使用位计算的话,就不需要表了。
#if USE_CRC_CCITT >= 1
// CRC_CCITT=X16+X12+X5+1,最高位先移入CRC寄存器bit0,
// CRC寄存器从bit0向bit15依次左移;CRC寄存器初始值为0。
INT16U gu16CrcTable[256];
void crcBuildTable(void)
{
INT8U i=0,j;
INT16U lu16CrcReg; //CRC寄存器
do{
lu16CrcReg = 0x0;
for(j=0x80; j!=0; j>>=1) //数据从高到低依次移入
{
if(lu16CrcReg & 0x8000) //CRC的bit15与输入的bit异或,为真则左移一位,
{ //然后与0x1021异或,为假则直接异或。
lu16CrcReg <<= 1; //此处程序将if(bit15^bit)分解为
lu16CrcReg ^= 0x1021; //if(bit15)和if(bit)两条语句,
} //因为两次异或后crc_reg不变.
else lu16CrcReg <<= 1;
if(j & i) //取出输入字节的相应位,即if(bit)
{
lu16CrcReg ^= 0x1021;
}
}
gu16CrcTable[i] = lu16CrcReg;
}
while(++i); //i为8位无符号数,其0xff+1为0,这样对于8位MCU效率高一些,
} //不应使用i<256而将i定义为16位宽。
#elif USE_CRC_32 >= 1
//CRC32=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+1,
//最高位先移入CRC寄存器bit0,CRC从bit0向bit31依次左移。
INT32U gu32CrcTable[256];
void crcBuildTable(void)
{
INT8U i = 0,j;
INT32U lu32CrcReg;
do{
crc_reg = 0x0;
for(j = 0x80; j != 0; j >>= 1)
{
if(lu32CrcReg & 0x80000000)
{
lu32CrcReg <<= 1;
lu32CrcReg ^= 0x04C11DB7;
}
else lu32CrcReg <<= 1;
if(j & i)
{
lu32CrcReg ^= 0x04C11DB7;
}
}
gu32CrcTable[i] = lu32CrcReg;
}
while(++i);
}
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -