新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > CRC位域單表查表及建表方法

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

        作者: 時間:2016-12-02 來源:網絡 收藏
        CRC位域8每表256個元素,適合以字節為存儲單位,故程序的入口參數用數組即表指針替代,如:
        網上的左移CRC16查表核心程序為(crcbuff為大端存儲模式):
        unsigned int GetCRCL16(unsigned int crcinit, unsigned char *crcbuff)
        {//(可以不要初值crcinit,多字節CRC16時入口需要對crcval做處理)
        unsigned int i, crc=0;
        for(i = 0;i < 2;i ++)//2個字節位域8只需要2次完成
        {
        crc = (crc << 8) ^ CRCL16_Col[(((crcinit ^ crc) >> 8) ^ *crcbuff++) & 0xFF];//位域寬8單表256個字節
        crcinit <<= 8;//下一位域的初值
        }
        return crc;
        }
        網上的右移CRC16查表核心程序為(crcbuff為小端存儲模式):
        unsigned int GetCRCR16(unsigned int crcinit, unsigned char *crcbuff)
        {//(可以不要初值crcinit,多字節CRC16時入口需要對crcval做處理)
        unsigned int i, crc=0;
        for(i = 0;i < 2;i ++)//2個字節位域8只需要2次完成
        {
        crc = (crc >> 8) ^ CRCR16_Col[((crcinit ^ crc) ^ *crcbuff++) & 0xFF];//位域寬8單表256個字節
        crcinit >>= 8;//下一位域的初值
        }
        return crc;
        }
        網上的左移CRC32查表核心程序為(crcbuff為大端存儲模式):
        unsigned long GetCRCL32(unsigned long crcinit, unsigned char *crcbuff)
        {//(可以不要初值crcinit,多字節CRC32時入口需要對crcval做處理)
        unsigned long i, crc=0;
        for(i = 0;i < 4;i ++)//4個字節位域8只需要4次完成
        {
        crc = (crc << 8) ^ CRCL32_Col[(((crcinit ^ crc) >> 24) ^ *crcbuff++) & 0xFF];//位域寬8單表256個字節
        crcinit <<= 8;//下一位域的初值
        }
        return crc;
        }
        網上的右移CRC32查表核心程序為(crcbuff為小端存儲模式):
        unsigned long GetCRCR32(unsigned long crcinit, unsigned char *crcbuff)
        {//(可以不要初值crcinit(一般為0或0xFFFFFFFF),多字節CRC32時入口需要對crcval做處理)
        unsigned long i, crc=0;
        for(i = 0;i < 4;i ++)//4個字節位域8只需要4次完成
        {
        crc = (crc >> 8) ^ CRCR32_Col[((crcinit ^ crc) ^ *crcbuff++) & 0xFF];//位域寬8單表256個字節
        crcinit >>= 8;//下一位域的初值
        }
        return crc;
        }
        CRC位域單表查表方法可以應用于任何CRC查表方法,它結合了傳統的移位算法和查表方法的各自優點,
        充分考慮了空間和速度之間的關系,對小容量及速度要求的單片機特別適用。
        由于位域可等長或不等長,故將可派生為更多“稀有”的查表方法,對加密算法比較有用。
        像CRC10,CRC12這種“非字節”存儲的CRC查表,可用位域2(CRC10)及位域3和位域4位域6等方法。
        總之位域4是更為普遍的壓縮CRC表格的好方法,位域寬度大則循環次數少速度更快。
        網上流行的一般為位域8,自然速度最快,但表格空間最大。
        本文給出了如何建立數組及查表程序及相應的移位算法程序,這里不是“比拼”,而是探討更多的查表方法。
        此法是菜農多年對CRC研究的結果和總結。
        具體應用:
        CRC64ISO(d800000000000000)的16四字表長查表程序
        CRC64ECMA(42F0E1EBA9EA3693)的16四字表長查表程序
        CRC32IEEE(EDB88320)的16雙字表長查表程序
        CRC16CCITT(1021)的16字表長查表程序
        CRC-16-IBM(A001)的16字表長查表程序
        1-Wire中CRC8的16字節表長查表程序
        SMBUS中PEC(CRC)16字節表長查表程序
        本文計算工具:[url=http://[color=]
        菜農HotPower@126.com 2009.10.18 于雁塔菜地
        上一頁 1 2 3 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 明星| 工布江达县| 松潘县| 夏邑县| 建宁县| 鹤岗市| 宽甸| 鄄城县| 时尚| 永和县| 常宁市| 五原县| 兰溪市| 筠连县| 高要市| 石阡县| 兴仁县| 江油市| 永仁县| 始兴县| 平和县| 洛阳市| 七台河市| 黎川县| 常州市| 阿鲁科尔沁旗| 花莲市| 嘉黎县| 绥滨县| 噶尔县| 平远县| 南京市| 县级市| 安丘市| 泾源县| 苏尼特右旗| 永靖县| 额尔古纳市| 桃园市| 阿瓦提县| 福贡县|