新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > CRC位域單表查表及建表方法

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

作者: 時(shí)間:2016-12-02 來源:網(wǎng)絡(luò) 收藏
對于左移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位域單表查表建表方

評論


技術(shù)專區(qū)

關(guān)閉