CRC位域單表查表及建表方法
實(shí)現(xiàn)壓縮表格的方法。CRC多位域多表查表方法的優(yōu)點(diǎn)就是“直觀”,特別對位域?qū)挾葹?即表長16時CRC明文每位
16進(jìn)制數(shù)即為表的坐標(biāo)。缺點(diǎn)是每個位域都對應(yīng)于一個CRC表,故表長的壓縮不是很理想。
CRC多項(xiàng)式種類及位數(shù)繁多,如CRC4,CRC8,CRC10,CRC12,CRC16,CRC24,CRC32,CRC40,CRC64等等,每種多項(xiàng)式
對應(yīng)與一個CRC矩陣,如CRC8為16*16的CRC8矩陣,CRC16為256*256的CRC16矩陣。即(2^(N/2))*(2^(N/2))的CRCN
矩陣。
為了壓縮表格空間,可以將CRC[a^b]=CRC[a]^CRC變?yōu)镃RC[a^b]=C^CRC[A^B]的形式減少為1個統(tǒng)一的CRC
表,其中C和A為上次CRC查表的一部分,B為CRC明文的一部分。 選擇位域?qū)挾葹?即表長為16來說明CRC位域
單表查表及建表方法,傳統(tǒng)的查表方法實(shí)際歸為位域?qū)挾葹?即表長為256的CRC位域單表查表方法。由于CRC算法
有左右移位之分,故其對應(yīng)查表程序和建表方法也不同。而CRC位域多表查表的查表程序和建表方法都是相同的。
以CRC8舉例,CRC8位域4雙表建表方法用其行和列各16個元素分別建立2個CRC表。
對于左移CRC8,權(quán)值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,權(quán)值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單表建表方法中,必須根據(jù)CRC的移位方式來來選擇某行或某列唯一16個元素建立1個CRC表.
故CRC位域單表相對CRC位域多表占用的空間要進(jìn)一步壓縮數(shù)倍,任何CRC表都可只用16個表格。
對于左移CRC8,權(quán)值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查表核心程序?yàn)?字符型不分大小端存儲模式):
unsigned char GetCRCL8(unsigned char crcinit, unsigned char crcval)
{//(可以不要初值crcinit,多字節(jié)CRC8時入口需要對crcval做處理)
unsigned char i, crc=0;
crcval = crcinit ^ crcval;
for(i = 0;i < 2;i ++)//1個字節(jié)位域4需要2次完成
{
crc = (crc << 4) ^ CRCL8_Col[((crc ^ crcval) >> 4) & 0x0F];//位域?qū)?單表16個字節(jié)
crcval <<= 4;//準(zhǔn)備下一個位域,域?qū)?
}
return crc;
}
對于右移CRC8,權(quán)值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查表核心程序?yàn)?字符型不分大小端存儲模式):
unsigned char GetCRCR8(unsigned char crcinit, unsigned char crcval)
{//(可以不要初值crcinit,多字節(jié)CRC8時入口需要對crcval做處理)
unsigned char i, crc=0;
crcval = crcinit ^ crcval;
for(i = 0;i < 2;i ++)//1個字節(jié)位域4需要2次完成
{
crc = (crc >> 4) ^ CRCR8_Row[(crc ^ crcval) & 0x0F];//位域?qū)?單表16個字節(jié)
crcval >>= 4;//準(zhǔn)備下一個位域,域?qū)?
}
return crc;
}
CRC位域4單表查表及建表原則:
左移位域4取列表16個,大端存儲模式。右移位域4取行表16個,小端存儲模式。
對于左移CRC12,權(quán)值XX,表格為(左移位域4取列表16個):
CRCL12_Col[16]={CRC[0x000],CRC[0x001],CRC[0x002],...CRC[0x00D],CRC[0x00E],CRC[0x00F]};
左移CRC12查表核心程序?yàn)?大端存儲模式):
unsigned int GetCRCL12(unsigned int crcinit, unsigned int crcval)
{//(可以不要初值crcinit,多字節(jié)CRC12時入口需要對crcval做處理)
unsigned int i, crc=0;
crcval = crcinit ^ crcval;
for(i = 0;i < 6;i ++)//3個字節(jié)位域4需要6次完成
{
crc = (crc << 4) ^ CRCL12_Col[((crc ^ crcval) >> 8) & 0x0F];//位域?qū)?單表16個字節(jié)
crcval <<= 4;//準(zhǔn)備下一個位域,域?qū)?
}
return crc;
}
對于右移CRC12,權(quán)值XX,表格為(右移位域4取行表16個):
CRCR12_Row[16]={CRC[0x0000],CRC[0x100],CRC[0x200],...CRC[0xD00],CRC[0xE00],CRC[0xF00]};
右移CRC12查表核心程序?yàn)?小端存儲模式):
unsigned int GetCRCR12(unsigned int crcinit, unsigned int crcval)
{//(可以不要初值crcinit,多字節(jié)CRC12時入口需要對crcval做處理)
unsigned int i, crc=0;
crcval = crcinit ^ crcval;
for(i = 0;i < 6;i ++)//3個字節(jié)位域4需要6次完成
{
crc = (crc >> 4) ^ CRCR12_Row[(crc ^ crcval) & 0x0F];//位域?qū)?單表16個字節(jié)
crcval >>= 4;//準(zhǔn)備下一個位域,域?qū)?
}
return crc;
}
關(guān)鍵詞:
CRC位域單表查表建表方
相關(guān)推薦
技術(shù)專區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機(jī)
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線
- 開關(guān)電源
- 單片機(jī)
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機(jī)控制
- 藍(lán)牙
- PLC
- PWM
- 汽車電子
- 轉(zhuǎn)換器
- 電源管理
- 信號放大器
評論