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)的移位算法和查表方法的各自?xún)?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=]
關(guān)鍵詞:
CRC位域單表查表建表方
相關(guān)推薦
技術(shù)專(zhuān)區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機(jī)
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線
- 開(kāi)關(guān)電源
- 單片機(jī)
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開(kāi)發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機(jī)控制
- 藍(lán)牙
- PLC
- PWM
- 汽車(chē)電子
- 轉(zhuǎn)換器
- 電源管理
- 信號(hào)放大器
評(píng)論