crc_optimal----boost学习笔记

2 篇文章 0 订阅
1 篇文章 0 订阅

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(),把所有的计算结果返回
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值