新聞中心

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

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

        作者: 時(shí)間:2016-12-02 來(lái)源:網(wǎng)絡(luò) 收藏
        對(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ū)?
        }

        關(guān)鍵詞: CRC位域單表查表建表方

        評(píng)論


        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 开鲁县| 偏关县| 泽普县| 淮安市| 保德县| 和田市| 沭阳县| 新乐市| 正安县| 新余市| 宝丰县| 庆云县| 都江堰市| 同心县| 武威市| 象山县| 宝清县| 松江区| 平乡县| 富平县| 乐都县| 乐山市| 石阡县| 宿松县| 彰化县| 东光县| 错那县| 县级市| 洱源县| 灌云县| 大英县| 新疆| 岑溪市| 乌审旗| 衡山县| 乐东| 广德县| 将乐县| 土默特右旗| 房产| 唐海县|