crc_optimal----boost学习笔记

来源:互联网 发布:域名注册网站查询 编辑:程序博客网 时间:2024/05/09 15:02

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(),把所有的计算结果返回
0 0
原创粉丝点击