crc_optimal----boost學習筆記

crc_optimal—-boost學習筆記

知識標籤 : boost, crc, C++

boost/crc.hpp中可查到

//Bits常選32或64,表示生成CRC32或CRC64校驗碼 
template < std::size_t Bits, BOOST_CRC_PARM_TYPE TruncPoly,
           BOOST_CRC_PARM_TYPE InitRem, BOOST_CRC_PARM_TYPE FinalXor,
           bool ReflectIn, bool ReflectRem >
class crc_optimal

常用接口

public:

    // 構造函數
    explicit  crc_optimal( value_type init_rem = InitRem );

    void reset( value_type new_rem = InitRem );

    // 計算單字符的CRC
    void  process_byte( unsigned char byte );
    // 該函數計算內存塊CRC,由頭文件中實現代碼可知:
    // 它循環調用process_byte(unsigned char byte)
    void  process_block( void const *bytes_begin, void const *bytes_end );

    // 該函數計算內存塊CRC,調用process_block
    void  process_bytes( void const *buffer, std::size_t byte_count );
    // 返回CRC結果
    value_type  checksum() const;

    // 以下兩個重載operator()含義完全不一樣,勿混淆

    // 重載operator(),它調用process_byte()
    void        operator ()( unsigned char byte );
    // 重載operator(),調用checksum()
    value_type  operator ()() const;

private:

    // Member data
    value_type  rem_;

又有

typedef crc_optimal<32, 0x04C11DB7, 0xFFFFFFFF, 0xFFFFFFFF, true, true>
  crc_32_type;

下面用crc_32_type寫段測試小程序

#include<iostream>
#include<algorithm>
#include<boost/crc.hpp>

int main(void)
{
    boost::crc_32_type crc32;   //一個crc對象
    std::cout << std::hex;  //設置16進制輸出
    std::cout << crc32.checksum() << std::endl;
    crc32.process_byte('a');    //計算一個byte
    std::cout << crc32.checksum() << std::endl; //結果
    crc32.process_bytes("0123456789", 10);  //計算10個字節
    std::cout << crc32.checksum() << std::endl;

    char szCh[] = "0123456789";
    crc32.reset();  //重新初始化
    crc32.process_block(szCh, szCh + 10);   //使用內存塊計算
    std::cout << crc32.checksum() << std::endl;

    std::cout << "--------------------" << std::endl;

    crc32.reset();
    crc32.process_bytes("0123456789", 10);
    std::cout << crc32() << std::endl;

    std::string str("0123456789");
    crc32.reset();
    //對於for_each見下面解釋
    std::cout << std::for_each(str.begin(), str.end(), crc32)() << std::endl;
    std::cout << crc32() << std::endl;  //無參,相當於checksum()

    return 0;
}

結果如下

這裏寫圖片描述

總結

由結果可知,同一數據CRC序列結果相同
猜想:crc_optimal參數設置合理的話,64bitCRC序列應該可以用做hash函數返回值

對於for_each有

    template<class _InIt, class _Fn1>  
    _Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func)  
    {// perform function for each element  
        for (; _First != _Last; ++_First)  
            _Func(*_First);
        return (_Func);  // 返回函數對象_Func
    }  
  • for_each(str.begin(), str.end(),crc32)依次把str中的元素作爲crc32()的一個參數
  • 它相當於對str每一個元素執行process_byte()
  • 之後for_each返回crc32函數對象
    for_each後面又多了一對(),表示調用crc32(),即相當於checksum(),把所有的計算結果返回
發佈了26 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章