您的位置 首页 解答

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

菜农在《CRC位域多表查表方法》一文中,利用CRC的性质:CRC[a^b]=CRC[a]^CRC,得出了多位域多表实现压缩表格的方法。CRC多位域多表查表方法

菜农在《CRC位域多表查表办法》一文中,使用CRC的“性质”:CRC[a^b]=CRC[a]^CRC, 得出了多位域多表

完结紧缩表格的办法。CRC多位域多表查表办法的长处便是“直观”,特别对位域宽度为4即表长16时CRC明文每位
16进制数即为表的坐标。缺陷是每个位域都对应于一个CRC表,故表长的紧缩不是很抱负。
CRC多项式品种及位数繁复,如CRC4,CRC8,CRC10,CRC12,CRC16,CRC24,CRC32,CRC40,CRC64等等,每种多项式
对应与一个CRC矩阵,如CRC8为16*16的CRC8矩阵,CRC16为256*256的CRC16矩阵。即(2^(N/2))*(2^(N/2))的CRCN
矩阵。
为了紧缩表格空间,能够将CRC[a^b]=CRC[a]^CRC变为CRC[a^b]=C^CRC[A^B]的方法削减为1个一致的CRC
表,其间C和A为前次CRC查表的一部分,B为CRC明文的一部分。 挑选位域宽度为4即表长为16来阐明CRC位域
单表查表及建表办法,传统的查表办法实践归为位域宽度为8即表长为256的CRC位域单表查表办法。因为CRC算法
有左右移位之分,故其对应查表程序和建表办法也不同。而CRC位域多表查表的查表程序和建表办法都是相同的。
以CRC8举例,CRC8位域4双表建表办法用其行和列各16个元素别离树立2个CRC表。
关于左移CRC8,权值0x07表格为:
CRCL8_Col[16]={0x00,0x07,0x0E,0x09,0x1C,0x1B,0x12,0x15,0x38,0x3F,0x36,0x31,0x24,0x23,0x2A,0x2D};
CRCL8_Row[16]={0x00,0x70,0xE0,0x90,0xC7,0xB7,0x27,0x57,0x89,0xF9,0x69,0x19,0x4E,0x3E,0xAE,0xDE};
关于右移CRC8,权值0x8C表格为:
CRCR8_Col[16]={0x00,0x5E,0xBC,0xE2,0x61,0x3F,0xDD,0x83,0xC2,0x9C,0x7E,0x20,0xA3,0xFD,0x1F,0x41};
CRCR8_Row[16]={0x00,0x9D,0x23,0xBE,0x46,0xDB,0x65,0xF8,0x8C,0x11,0xAF,0x32,0xCA,0x57,0xE9,0x74};
而在CRC8位域4单表建表办法中,有必要依据CRC的移位方法来来挑选某行或某列仅有16个元素树立1个CRC表.
故CRC位域单表相对CRC位域多表占用的空间要进一步紧缩数倍,任何CRC表都可只用16个表格。
关于左移CRC8,权值0x07表格为(左移位域4取列表16个):
CRCL8_Col[16]={CRC[0x00],CRC[0x01],CRC[0x02],…CRC[0x0D],CRC[0x0E],CRC[0x0F]};
即:CRCL8_Col[16]={0x00,0x07,0x0E,0x09,0x1C,0x1B,0x12,0x15,0x38,0x3F,0x36,0x31,0x24,0x23,0x2A,0x2D};
左移CRC8查表中心程序为(字符型不分巨细端存储形式):
unsigned char GetCRCL8(unsigned char crcinit, unsigned char crcval)
{//(能够不要初值crcinit,多字节CRC8时进口需求对crcval做处理)
unsigned char i, crc=0;
crcval = crcinit ^ crcval;
for(i = 0;i < 2;i ++)//1个字节位域4需求2次完结
{
crc = (crc << 4) ^ CRCL8_Col[((crc ^ crcval) >> 4) & 0x0F];//位域宽4单表16个字节
crcval <<= 4;//预备下一个位域,域宽4
}
return crc;
}
关于右移CRC8,权值0x8C表格为(右移位域4取行表16个):
CRCR8_Row[16]={CRC[0x00],CRC[0x10],CRC[0x20],…CRC[0xD0],CRC[0xE0],CRC[0xF0]};
即:CRCR8_Row[16]={0x00,0x9D,0x23,0xBE,0x46,0xDB,0x65,0xF8,0x8C,0x11,0xAF,0x32,0xCA,0x57,0xE9,0x74};
右移CRC8查表中心程序为(字符型不分巨细端存储形式):
unsigned char GetCRCR8(unsigned char crcinit, unsigned char crcval)
{//(能够不要初值crcinit,多字节CRC8时进口需求对crcval做处理)
unsigned char i, crc=0;
crcval = crcinit ^ crcval;
for(i = 0;i < 2;i ++)//1个字节位域4需求2次完结
{
crc = (crc >> 4) ^ CRCR8_Row[(crc ^ crcval) & 0x0F];//位域宽4单表16个字节
crcval >>= 4;//预备下一个位域,域宽4
}
return crc;
}
CRC位域4单表查表及建表准则:
左移位域4取列表16个,大端存储形式。右移位域4取行表16个,小端存储形式。
关于左移CRC12,权值XX,表格为(左移位域4取列表16个):
CRCL12_Col[16]={CRC[0x000],CRC[0x001],CRC[0x002],…CRC[0x00D],CRC[0x00E],CRC[0x00F]};
左移CRC12查表中心程序为(大端存储形式):
unsigned int GetCRCL12(unsigned int crcinit, unsigned int crcval)
{//(能够不要初值crcinit,多字节CRC12时进口需求对crcval做处理)
unsigned int i, crc=0;
crcval = crcinit ^ crcval;
for(i = 0;i < 6;i ++)//3个字节位域4需求6次完结
{
crc = (crc << 4) ^ CRCL12_Col[((crc ^ crcval) >> 8) & 0x0F];//位域宽4单表16个字节
crcval <<= 4;//预备下一个位域,域宽4
}
return crc;
}
关于右移CRC12,权值XX,表格为(右移位域4取行表16个):
CRCR12_Row[16]={CRC[0x0000],CRC[0x100],CRC[0x200],…CRC[0xD00],CRC[0xE00],CRC[0xF00]};
右移CRC12查表中心程序为(小端存储形式):
unsigned int GetCRCR12(unsigned int crcinit, unsigned int crcval)
{//(能够不要初值crcinit,多字节CRC12时进口需求对crcval做处理)
unsigned int i, crc=0;
crcval = crcinit ^ crcval;
for(i = 0;i < 6;i ++)//3个字节位域4需求6次完结
{
crc = (crc >> 4) ^ CRCR12_Row[(crc ^ crcval) & 0x0F];//位域宽4单表16个字节
crcval >>= 4;//预备下一个位域,域宽4
}
return crc;
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/jieda/254541.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部