CRC位域單表查表及建表方法
對于左移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í)入口需要對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;
}
對于右移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í)入口需要對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;
}
對于左移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í)入口需要對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;
}
對于右移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í)入口需要對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ǔ)模式。
對于左移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í)入口需要對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;
}
對于右移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í)入口需要對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;
}
對于左移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í)入口需要對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;
}
對于右移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í)入口需要對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;
}
關(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)換器
- 電源管理
- 信號(hào)放大器
評論