新闻中心

EEPW首页>嵌入式系统>设计应用> CRC位域单表查表及建表方法

CRC位域单表查表及建表方法

作者: 时间:2016-12-02 来源:网络 收藏
对于左移CRC16,权值XX,表格为(左移位域4取列表16个):
CRCL16_Col[16]={CRC[0x0000],CRC[0x0001],CRC[0x0002],...CRC[0x000D],CRC[0x000E],CRC[0x000F]};
左移CRC16查表核心程序为(大端存储模式):
unsigned int GetCRCL16(unsigned int crcinit, unsigned int crcval)
{//(可以不要初值crcinit,多字节CRC16时入口需要对crcval做处理)
unsigned int i, crc=0;
crcval = crcinit ^ crcval;
for(i = 0;i < 4;i ++)//2个字节位域4需要4次完成
{
crc = (crc << 4) ^ CRCL16_Col[((crc ^ crcval) >> 12) & 0x0F];//位域宽4单表16个字节
crcval <<= 4;//准备下一个位域,域宽4
}
return crc;
}
对于右移CRC16,权值XX,表格为(右移位域4取行表16个):
CRCR16_Row[16]={CRC[0x0000],CRC[0x1000],CRC[0x2000],...CRC[0xD000],CRC[0xE000],CRC[0xF000]};
右移CRC16查表核心程序为(小端存储模式):
unsigned int GetCRCR16(unsigned int crcinit, unsigned int crcval)
{//(可以不要初值crcinit,多字节CRC16时入口需要对crcval做处理)
unsigned int i, crc=0;
crcval = crcinit ^ crcval;
for(i = 0;i < 4;i ++)//2个字节位域4需要4次完成
{
crc = (crc >> 4) ^ CRCR16_Row[(crc ^ crcval) & 0x0F];//位域宽4单表16个字节
crcval >>= 4;//准备下一个位域,域宽4
}
return crc;
}
对于左移CRC32,权值XX,表格为(左移位域4取列表16个):
CRCL32_Col[16]={CRC[0x00000000],CRC[0x00000001],...CRC[0x0000000E],CRC[0x0000000F]};
左移CRC32查表核心程序为(大端存储模式):
unsigned long GetCRCL32(unsigned long crcinit, unsigned long crcval)
{//(可以不要初值crcinit,多字节CRC32时入口需要对crcval做处理)
unsigned long i, crc=0;
crcval = crcinit ^ crcval;
for(i = 0;i < 8;i ++)//4个字节位域4需要8次完成
{
crc = (crc << 4) ^ CRCL32_Col[((crc ^ crcval) >> 28) & 0x0F];//位域宽4单表16个字节
crcval <<= 4;//准备下一个位域,域宽4
}
return crc;
}
对于右移CRC32,权值XX,表格为(右移位域4取行表16个):
CRCR32_Row[16]={CRC[0x00000000],CRC[0x10000000],...CRC[0xE0000000],CRC[0xF0000000]};
右移CRC32查表核心程序为(小端存储模式):
unsigned int GetCRCR32(unsigned long crcinit, unsigned long crcval)
{//(可以不要初值crcinit,多字节CRC32时入口需要对crcval做处理)
unsigned long i, crc=0;
crcval = crcinit ^ crcval;
for(i = 0;i < 8;i ++)//4个字节位域4需要8次完成
{
crc = (crc >> 4) ^ CRCR32_Row[(crc ^ crcval) & 0x0F];//位域宽4单表16个字节
crcval >>= 4;//准备下一个位域,域宽4
}
return crc;
}
CRC位域8单表查表及建表原则(传统的查表模式):
左移位域8取列表256个,大端存储模式。右移位域8取行表256个,小端存储模式。
对于左移CRC16,权值XX,表格为(左移位域8取列表256个):
CRCL16_Col[256]={CRC[0x0000],CRC[0x0001],CRC[0x0002],...CRC[0x00FD],CRC[0x00FE],CRC[0x00FF]};
左移CRC16查表核心程序为(大端存储模式):
unsigned int GetCRCL16(unsigned int crcinit, unsigned int crcval)
{//(可以不要初值crcinit,多字节CRC16时入口需要对crcval做处理)
unsigned int i, crc=0;
crcval = crcinit ^ crcval;
for(i = 0;i < 2;i ++)//2个字节位域8只需要2次完成
{
crc = (crc << 8) ^ CRCL16_Col[((crc ^ crcval) >> 8) & 0xFF];//位域宽8单表256个字节
crcval <<= 8;//准备下一个位域,域宽8
}
return crc;
}
对于右移CRC16,权值XX,表格为(右移位域8取行表256个):
CRCR16_Row[256]={CRC[0x0000],CRC[0x1000],CRC[0x2000],...CRC[0xFD00],CRC[0xFE00],CRC[0xFF00]};
右移CRC16查表核心程序为(小端存储模式):
unsigned int GetCRCR16(unsigned int crcinit, unsigned int crcval)
{//(可以不要初值crcinit,多字节CRC16时入口需要对crcval做处理)
unsigned int i, crc=0;
crcval = crcinit ^ crcval;
for(i = 0;i < 2;i ++)//2个字节位域8只需要2次完成
{
crc = (crc >> 8) ^ CRCR16_Row[(crc ^ crcval) & 0xFF];//位域宽8单表256个字节
crcval >>= 8;//准备下一个位域,域宽8
}
return crc;
}
对于左移CRC32,权值XX,表格为(左移位域8取列表256个):
CRCL32_Col[256]={CRC[0x00000000],CRC[0x00000001],...CRC[0x000000FE],CRC[0x000000FF]};
左移CRC32查表核心程序为(大端存储模式):
unsigned long GetCRCL32(unsigned long crcinit, unsigned long crcval)
{//(可以不要初值crcinit,多字节CRC32时入口需要对crcval做处理)
unsigned long i, crc=0;
crcval = crcinit ^ crcval;
for(i = 0;i < 4;i ++)//4个字节位域8只需要4次完成
{
crc = (crc << 8) ^ CRCL32_Col[((crc ^ crcval) >> 24) & 0x0F];//位域宽8单表256个字节
crcval <<= 8;//准备下一个位域,域宽8
}
return crc;
}
对于右移CRC32,权值XX,表格为(右移位域8取行表256个):
CRCR32_Row[256]={CRC[0x00000000],CRC[0x10000000],...CRC[0xFE000000],CRC[0xFF000000]};
右移CRC32查表核心程序为(小端存储模式):
unsigned long GetCRCR32(unsigned long crcinit, unsigned long crcval)
{//(可以不要初值crcinit,多字节CRC32时入口需要对crcval做处理)
unsigned long i, crc=0;
crcval = crcinit ^ crcval;
for(i = 0;i < 4;i ++)//4个字节位域8只需要4次完成
{
crc = (crc >> 8) ^ CRCR32_Row[(crc ^ crcval) & 0xFF];//位域宽8单表256个字节
crcval >>= 8;//准备下一个位域,域宽8
}
return crc;
}

评论


技术专区