国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

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

發(fā)布時(shí)間:2009-10-18 14:25    發(fā)布者:hotpower
關(guān)鍵詞: CRC , 單表 , 位域
本帖最后由 hotpower 于 2009-10-18 21:28 編輯

菜農(nóng)在《CRC位域多表查表方法》一文中,利用CRC的“性質(zhì)”:CRC[a^b]=CRC[a]^CRC, 得出了多位域多表
實(shí)現(xiàn)壓縮表格的方法。CRC多位域多表查表方法的優(yōu)點(diǎn)就是“直觀”,特別對(duì)位域?qū)挾葹?即表長(zhǎng)16時(shí)CRC明文每位
16進(jìn)制數(shù)即為表的坐標(biāo)。缺點(diǎn)是每個(gè)位域都對(duì)應(yīng)于一個(gè)CRC表,故表長(zhǎng)的壓縮不是很理想。
CRC多項(xiàng)式種類及位數(shù)繁多,如CRC4,CRC8,CRC10,CRC12,CRC16,CRC24,CRC32,CRC40,CRC64等等,每種多項(xiàng)式
對(duì)應(yīng)與一個(gè)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個(gè)統(tǒng)一的CRC
表,其中C和A為上次CRC查表的一部分,B為CRC明文的一部分。 選擇位域?qū)挾葹?即表長(zhǎng)為16來(lái)說(shuō)明CRC位域
單表查表及建表方法,傳統(tǒng)的查表方法實(shí)際歸為位域?qū)挾葹?即表長(zhǎng)為256的CRC位域單表查表方法。由于CRC算法
有左右移位之分,故其對(duì)應(yīng)查表程序和建表方法也不同。而CRC位域多表查表的查表程序和建表方法都是相同的。
以CRC8舉例,CRC8位域4雙表建表方法用其行和列各16個(gè)元素分別建立2個(gè)CRC表。
對(duì)于左移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};
對(duì)于右移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的移位方式來(lái)來(lái)選擇某行或某列唯一16個(gè)元素建立1個(gè)CRC表.
故CRC位域單表相對(duì)CRC位域多表占用的空間要進(jìn)一步壓縮數(shù)倍,任何CRC表都可只用16個(gè)表格。
對(duì)于左移CRC8,權(quán)值0x07表格為(左移位域4取列表16個(gè)):
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)?字符型不分大小端存儲(chǔ)模式):
unsigned char GetCRCL8(unsigned char crcinit, unsigned char crcval)
{//(可以不要初值crcinit,多字節(jié)CRC8時(shí)入口需要對(duì)crcval做處理)
unsigned char i, crc=0;
crcval = crcinit ^ crcval;
for(i = 0;i < 2;i ++)//1個(gè)字節(jié)位域4需要2次完成
{
crc = (crc << 4) ^ CRCL8_Col[((crc ^ crcval) >> 4) & 0x0F];//位域?qū)?單表16個(gè)字節(jié)
crcval <<= 4;//準(zhǔn)備下一個(gè)位域,域?qū)?
}
return crc;
}
對(duì)于右移CRC8,權(quán)值0x8C表格為(右移位域4取行表16個(gè)):
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)?字符型不分大小端存儲(chǔ)模式):
unsigned char GetCRCR8(unsigned char crcinit, unsigned char crcval)
{//(可以不要初值crcinit,多字節(jié)CRC8時(shí)入口需要對(duì)crcval做處理)
unsigned char i, crc=0;
crcval = crcinit ^ crcval;
for(i = 0;i < 2;i ++)//1個(gè)字節(jié)位域4需要2次完成
{
crc = (crc >> 4) ^ CRCR8_Row[(crc ^ crcval) & 0x0F];//位域?qū)?單表16個(gè)字節(jié)
crcval >>= 4;//準(zhǔn)備下一個(gè)位域,域?qū)?
}
return crc;
}
CRC位域4單表查表及建表原則:
左移位域4取列表16個(gè),大端存儲(chǔ)模式。右移位域4取行表16個(gè),小端存儲(chǔ)模式。

對(duì)于左移CRC12,權(quán)值XX,表格為(左移位域4取列表16個(gè)):
CRCL12_Col[16]={CRC[0x000],CRC[0x001],CRC[0x002],...CRC[0x00D],CRC[0x00E],CRC[0x00F]};
左移CRC12查表核心程序?yàn)?大端存儲(chǔ)模式):
unsigned int GetCRCL12(unsigned int crcinit, unsigned int crcval)
{//(可以不要初值crcinit,多字節(jié)CRC12時(shí)入口需要對(duì)crcval做處理)
unsigned int i, crc=0;
crcval = crcinit ^ crcval;
for(i = 0;i < 6;i ++)//3個(gè)字節(jié)位域4需要6次完成
{
crc = (crc << 4) ^ CRCL12_Col[((crc ^ crcval) >> 8) & 0x0F];//位域?qū)?單表16個(gè)字節(jié)
crcval <<= 4;//準(zhǔn)備下一個(gè)位域,域?qū)?
}
return crc;
}
對(duì)于右移CRC12,權(quán)值XX,表格為(右移位域4取行表16個(gè)):
CRCR12_Row[16]={CRC[0x0000],CRC[0x100],CRC[0x200],...CRC[0xD00],CRC[0xE00],CRC[0xF00]};
右移CRC12查表核心程序?yàn)?小端存儲(chǔ)模式):
unsigned int GetCRCR12(unsigned int crcinit, unsigned int crcval)
{//(可以不要初值crcinit,多字節(jié)CRC12時(shí)入口需要對(duì)crcval做處理)
unsigned int i, crc=0;
crcval = crcinit ^ crcval;
for(i = 0;i < 6;i ++)//3個(gè)字節(jié)位域4需要6次完成
{
crc = (crc >> 4) ^ CRCR12_Row[(crc ^ crcval) & 0x0F];//位域?qū)?單表16個(gè)字節(jié)
crcval >>= 4;//準(zhǔn)備下一個(gè)位域,域?qū)?
}
return crc;
}

對(duì)于左移CRC16,權(quán)值XX,表格為(左移位域4取列表16個(gè)):
CRCL16_Col[16]={CRC[0x0000],CRC[0x0001],CRC[0x0002],...CRC[0x000D],CRC[0x000E],CRC[0x000F]};
左移CRC16查表核心程序?yàn)?大端存儲(chǔ)模式):
unsigned int GetCRCL16(unsigned int crcinit, unsigned int crcval)
{//(可以不要初值crcinit,多字節(jié)CRC16時(shí)入口需要對(duì)crcval做處理)
unsigned int i, crc=0;
crcval = crcinit ^ crcval;
for(i = 0;i < 4;i ++)//2個(gè)字節(jié)位域4需要4次完成
{
crc = (crc << 4) ^ CRCL16_Col[((crc ^ crcval) >> 12) & 0x0F];//位域?qū)?單表16個(gè)字節(jié)
crcval <<= 4;//準(zhǔn)備下一個(gè)位域,域?qū)?
}
return crc;
}
對(duì)于右移CRC16,權(quán)值XX,表格為(右移位域4取行表16個(gè)):
CRCR16_Row[16]={CRC[0x0000],CRC[0x1000],CRC[0x2000],...CRC[0xD000],CRC[0xE000],CRC[0xF000]};
右移CRC16查表核心程序?yàn)?小端存儲(chǔ)模式):
unsigned int GetCRCR16(unsigned int crcinit, unsigned int crcval)
{//(可以不要初值crcinit,多字節(jié)CRC16時(shí)入口需要對(duì)crcval做處理)
unsigned int i, crc=0;
crcval = crcinit ^ crcval;
for(i = 0;i < 4;i ++)//2個(gè)字節(jié)位域4需要4次完成
{
crc = (crc >> 4) ^ CRCR16_Row[(crc ^ crcval) & 0x0F];//位域?qū)?單表16個(gè)字節(jié)
crcval >>= 4;//準(zhǔn)備下一個(gè)位域,域?qū)?
}
return crc;
}

對(duì)于左移CRC32,權(quán)值XX,表格為(左移位域4取列表16個(gè)):
CRCL32_Col[16]={CRC[0x00000000],CRC[0x00000001],...CRC[0x0000000E],CRC[0x0000000F]};
左移CRC32查表核心程序?yàn)?大端存儲(chǔ)模式):
unsigned long GetCRCL32(unsigned long crcinit, unsigned long crcval)
{//(可以不要初值crcinit,多字節(jié)CRC32時(shí)入口需要對(duì)crcval做處理)
unsigned long i, crc=0;
crcval = crcinit ^ crcval;
for(i = 0;i < 8;i ++)//4個(gè)字節(jié)位域4需要8次完成
{
crc = (crc << 4) ^ CRCL32_Col[((crc ^ crcval) >> 28) & 0x0F];//位域?qū)?單表16個(gè)字節(jié)
crcval <<= 4;//準(zhǔn)備下一個(gè)位域,域?qū)?
}
return crc;
}
對(duì)于右移CRC32,權(quán)值XX,表格為(右移位域4取行表16個(gè)):
CRCR32_Row[16]={CRC[0x00000000],CRC[0x10000000],...CRC[0xE0000000],CRC[0xF0000000]};
右移CRC32查表核心程序?yàn)?小端存儲(chǔ)模式):
unsigned int GetCRCR32(unsigned long crcinit, unsigned long crcval)
{//(可以不要初值crcinit,多字節(jié)CRC32時(shí)入口需要對(duì)crcval做處理)
unsigned long i, crc=0;
crcval = crcinit ^ crcval;
for(i = 0;i < 8;i ++)//4個(gè)字節(jié)位域4需要8次完成
{
crc = (crc >> 4) ^ CRCR32_Row[(crc ^ crcval) & 0x0F];//位域?qū)?單表16個(gè)字節(jié)
crcval >>= 4;//準(zhǔn)備下一個(gè)位域,域?qū)?
}
return crc;
}
CRC位域8單表查表及建表原則(傳統(tǒng)的查表模式):
左移位域8取列表256個(gè),大端存儲(chǔ)模式。右移位域8取行表256個(gè),小端存儲(chǔ)模式。
對(duì)于左移CRC16,權(quán)值XX,表格為(左移位域8取列表256個(gè)):
CRCL16_Col[256]={CRC[0x0000],CRC[0x0001],CRC[0x0002],...CRC[0x00FD],CRC[0x00FE],CRC[0x00FF]};
左移CRC16查表核心程序?yàn)?大端存儲(chǔ)模式):
unsigned int GetCRCL16(unsigned int crcinit, unsigned int crcval)
{//(可以不要初值crcinit,多字節(jié)CRC16時(shí)入口需要對(duì)crcval做處理)
unsigned int i, crc=0;
crcval = crcinit ^ crcval;
for(i = 0;i < 2;i ++)//2個(gè)字節(jié)位域8只需要2次完成
{
crc = (crc << 8) ^ CRCL16_Col[((crc ^ crcval) >> 8) & 0xFF];//位域?qū)?單表256個(gè)字節(jié)
crcval <<= 8;//準(zhǔn)備下一個(gè)位域,域?qū)?
}
return crc;
}
對(duì)于右移CRC16,權(quán)值XX,表格為(右移位域8取行表256個(gè)):
CRCR16_Row[256]={CRC[0x0000],CRC[0x1000],CRC[0x2000],...CRC[0xFD00],CRC[0xFE00],CRC[0xFF00]};
右移CRC16查表核心程序?yàn)?小端存儲(chǔ)模式):
unsigned int GetCRCR16(unsigned int crcinit, unsigned int crcval)
{//(可以不要初值crcinit,多字節(jié)CRC16時(shí)入口需要對(duì)crcval做處理)
unsigned int i, crc=0;
crcval = crcinit ^ crcval;
for(i = 0;i < 2;i ++)//2個(gè)字節(jié)位域8只需要2次完成
{
crc = (crc >> 8) ^ CRCR16_Row[(crc ^ crcval) & 0xFF];//位域?qū)?單表256個(gè)字節(jié)
crcval >>= 8;//準(zhǔn)備下一個(gè)位域,域?qū)?
}
return crc;
}

對(duì)于左移CRC32,權(quán)值XX,表格為(左移位域8取列表256個(gè)):
CRCL32_Col[256]={CRC[0x00000000],CRC[0x00000001],...CRC[0x000000FE],CRC[0x000000FF]};
左移CRC32查表核心程序?yàn)?大端存儲(chǔ)模式):
unsigned long GetCRCL32(unsigned long crcinit, unsigned long crcval)
{//(可以不要初值crcinit,多字節(jié)CRC32時(shí)入口需要對(duì)crcval做處理)
unsigned long i, crc=0;
crcval = crcinit ^ crcval;
for(i = 0;i < 4;i ++)//4個(gè)字節(jié)位域8只需要4次完成
{
crc = (crc << 8) ^ CRCL32_Col[((crc ^ crcval) >> 24) & 0x0F];//位域?qū)?單表256個(gè)字節(jié)
crcval <<= 8;//準(zhǔn)備下一個(gè)位域,域?qū)?
}
return crc;
}
對(duì)于右移CRC32,權(quán)值XX,表格為(右移位域8取行表256個(gè)):
CRCR32_Row[256]={CRC[0x00000000],CRC[0x10000000],...CRC[0xFE000000],CRC[0xFF000000]};
右移CRC32查表核心程序?yàn)?小端存儲(chǔ)模式):
unsigned long GetCRCR32(unsigned long crcinit, unsigned long crcval)
{//(可以不要初值crcinit,多字節(jié)CRC32時(shí)入口需要對(duì)crcval做處理)
unsigned long i, crc=0;
crcval = crcinit ^ crcval;
for(i = 0;i < 4;i ++)//4個(gè)字節(jié)位域8只需要4次完成
{
crc = (crc >> 8) ^ CRCR32_Row[(crc ^ crcval) & 0xFF];//位域?qū)?單表256個(gè)字節(jié)
crcval >>= 8;//準(zhǔn)備下一個(gè)位域,域?qū)?
}
return crc;
}

CRC位域8每表256個(gè)元素,適合以字節(jié)為存儲(chǔ)單位,故程序的入口參數(shù)用數(shù)組即表指針替代,如:

網(wǎng)上的左移CRC16查表核心程序?yàn)?crcbuff為大端存儲(chǔ)模式):
unsigned int GetCRCL16(unsigned int crcinit, unsigned char *crcbuff)
{//(可以不要初值crcinit,多字節(jié)CRC16時(shí)入口需要對(duì)crcval做處理)
unsigned int i, crc=0;
for(i = 0;i < 2;i ++)//2個(gè)字節(jié)位域8只需要2次完成
{
crc = (crc << 8) ^ CRCL16_Col[(((crcinit ^ crc) >> 8) ^ *crcbuff++) & 0xFF];//位域?qū)?單表256個(gè)字節(jié)
crcinit <<= 8;//下一位域的初值
}
return crc;
}

網(wǎng)上的右移CRC16查表核心程序?yàn)?crcbuff為小端存儲(chǔ)模式):
unsigned int GetCRCR16(unsigned int crcinit, unsigned char *crcbuff)
{//(可以不要初值crcinit,多字節(jié)CRC16時(shí)入口需要對(duì)crcval做處理)
unsigned int i, crc=0;
for(i = 0;i < 2;i ++)//2個(gè)字節(jié)位域8只需要2次完成
{
crc = (crc >> 8) ^ CRCR16_Col[((crcinit ^ crc) ^ *crcbuff++) & 0xFF];//位域?qū)?單表256個(gè)字節(jié)
crcinit >>= 8;//下一位域的初值
}
return crc;
}

網(wǎng)上的左移CRC32查表核心程序?yàn)?crcbuff為大端存儲(chǔ)模式):
unsigned long GetCRCL32(unsigned long crcinit, unsigned char *crcbuff)
{//(可以不要初值crcinit,多字節(jié)CRC32時(shí)入口需要對(duì)crcval做處理)
unsigned long i, crc=0;
for(i = 0;i < 4;i ++)//4個(gè)字節(jié)位域8只需要4次完成
{
crc = (crc << 8) ^ CRCL32_Col[(((crcinit ^ crc) >> 24) ^ *crcbuff++) & 0xFF];//位域?qū)?單表256個(gè)字節(jié)
crcinit <<= 8;//下一位域的初值
}
return crc;
}

網(wǎng)上的右移CRC32查表核心程序?yàn)?crcbuff為小端存儲(chǔ)模式):
unsigned long GetCRCR32(unsigned long crcinit, unsigned char *crcbuff)
{//(可以不要初值crcinit(一般為0或0xFFFFFFFF),多字節(jié)CRC32時(shí)入口需要對(duì)crcval做處理)
unsigned long i, crc=0;
for(i = 0;i < 4;i ++)//4個(gè)字節(jié)位域8只需要4次完成
{
crc = (crc >> 8) ^ CRCR32_Col[((crcinit ^ crc) ^ *crcbuff++) & 0xFF];//位域?qū)?單表256個(gè)字節(jié)
crcinit >>= 8;//下一位域的初值
}
return crc;
}


CRC位域單表查表方法可以應(yīng)用于任何CRC查表方法,它結(jié)合了傳統(tǒng)的移位算法和查表方法的各自優(yōu)點(diǎn),
充分考慮了空間和速度之間的關(guān)系,對(duì)小容量及速度要求的單片機(jī)特別適用。
由于位域可等長(zhǎng)或不等長(zhǎng),故將可派生為更多“稀有”的查表方法,對(duì)加密算法比較有用。
像CRC10,CRC12這種“非字節(jié)”存儲(chǔ)的CRC查表,可用位域2(CRC10)及位域3和位域4位域6等方法。
總之位域4是更為普遍的壓縮CRC表格的好方法,位域?qū)挾却髣t循環(huán)次數(shù)少速度更快。
網(wǎng)上流行的一般為位域8,自然速度最快,但表格空間最大。


本文給出了如何建立數(shù)組及查表程序及相應(yīng)的移位算法程序,這里不是“比拼”,而是探討更多的查表方法。
此法是菜農(nóng)多年對(duì)CRC研究的結(jié)果和總結(jié)。


具體應(yīng)用:
CRC64ISO(d800000000000000)的16四字表長(zhǎng)查表程序
CRC64ECMA(42F0E1EBA9EA3693)的16四字表長(zhǎng)查表程序
CRC32IEEE(EDB88320)的16雙字表長(zhǎng)查表程序
CRC16CCITT(1021)的16字表長(zhǎng)查表程序
CRC-16-IBM(A001)的16字表長(zhǎng)查表程序
1-Wire中CRC8的16字節(jié)表長(zhǎng)查表程序
SMBUS中PEC(CRC)16字節(jié)表長(zhǎng)查表程序


本文計(jì)算工具:[url=http://[color=]http://www.hotc51.com/HotPower_HotWC3.html[/url]

菜農(nóng)HotPower@126.com 2009.10.18 于雁塔菜地
本文地址:http://m.qingdxww.cn/thread-4778-1-1.html     【打印本頁(yè)】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
alpha321 發(fā)表于 2009-11-14 12:24:47
文章很實(shí)用,非常感謝!
Netjob 發(fā)表于 2009-11-14 16:14:24
看得我眼睛繚亂!

目前比較主流的單片機(jī)都內(nèi)帶硬件的CRC單元,好比STM32的CRC32
MSP430的CRC-16.
您需要登錄后才可以發(fā)表評(píng)論 登錄 | 立即注冊(cè)

廠商推薦

  • Microchip視頻專區(qū)
  • 使用SAM-IoT Wx v2開發(fā)板演示AWS IoT Core應(yīng)用程序
  • 使用Harmony3加速TCP/IP應(yīng)用的開發(fā)培訓(xùn)教程
  • 集成高級(jí)模擬外設(shè)的PIC18F-Q71家族介紹培訓(xùn)教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿(mào)澤電子(Mouser)專區(qū)
關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美三级视频网 | 视频一区二区在线播放 | 午夜精品久视频在线观看 | 欧美一区二区精品系列在线观看 | 黄色片视频免费看 | 欧美 日韩 国产在线 | 国产不卡一区二区视频免费 | 曰本亚洲欧洲色a在线 | 日本一区二区三区精品 | 久久99视频免费 | 日韩视频在线免费观看 | 九色国产在视频线精品视频 | 欧美视频精品一区二区三区 | 欧美成人一区二区三区不卡视频 | 羞羞免费网站 | 高清在线一区二区 | 欧美日韩在线国产 | 高清亚洲 | 99精品视频免费观看 | 日本一区二区三区视频在线 | 成人一区二区免费中文字幕 | 成人在线免费播放 | 精品国产免费一区二区三区 | 99在线观看免费视频 | 2014av手机天堂网 | 国产黄色大片又色又爽 | 日韩性黄色一级 | 天堂新版资源中文最新版下载地址 | 91麻豆国产香蕉久久精品 | 国产在线观看免费一级 | 99精品视频在线视频免费观看 | 黄色网站手机在线观看 | 伊人久久综在合线亚洲91 | 一本卡二卡三乱码最近更新版 | 亚洲精品国产精品乱码不97 | 欧美日韩亚洲国内综合网香蕉 | 91精品国产网曝事件门 | aaa一级| 欧美国产亚洲一区 | 国内精品久久久久久久星辰影视 | 国产精品区一区二区三 |