Boost C++ 库

……世界上最受推崇且设计最专业的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu,《C++ 编码规范

理论 CRC 计算器 - Boost C++ 函数库
PrevUpHomeNext
#include <cstddef>  // for std::size_t

namespace boost
{
    template < std::size_t Bits >
    class crc_basic;
}

boost::crc_basic 类模板充当一个未增强的 CRC 处理器,可以接受位级输入。它仅将一个 Rocksoft™ 模型 CRC 算法参数作为模板参数,即 WIDTH,该参数确定用于除法寄存器的内置无符号整数类型。其他 Rocksoft™ 模型 CRC 算法参数可以通过构造函数传入。(大多数参数都有默认值。)

用于寄存器的整数类型发布为 value_type,而 Rocksoft™ 模型 CRC 算法属性可以通过以下方式发现:

表 9.1. boost::crc_basic 中的 RMCA 参数

Parameter

成员名称

种类

表达式类型

WIDTH

bit_count

类静态不可变数据成员

std::size_t

POLY

get_truncated_polynominal

const 成员函数

value_type

INIT

get_initial_remainder

const 成员函数

value_type

REFIN

get_reflect_input

const 成员函数

bool

REFOUT

get_reflect_remainder

const 成员函数

bool

XOROUT

get_final_xor_value

const 成员函数

value_type


由于大多数参数是在运行时指定的,您可以重用同一个计算器对象来处理具有不同参数的单独运行。该类型使用自动定义的复制/移动/赋值和析构例程。

这是一个重用的示例

std::pair<unsigned, unsigned> crc_16_and_xmodem( void const *b, std::size_t l )
{
    std::pair<unsigned, unsigned>  result;
    1boost::crc_basic<16>           crc1( 0x8005u, 0u, 0u, true, true );

    crc1.process_bytes( b, l );
    result.first = crc1.checksum();
    2crc1 = boost::crc_basic<16>( 0x8408u, crc1.get_initial_remainder(),
     crc1.get_final_xor_value(), crc1.get_reflect_input(),
     crc1.get_reflect_remainder() );
    crc1.process_bytes( b, l );
    result.second = crc1.checksum();

    return result;
}

目前,大多数 Rocksoft™ 模型 CRC 算法参数只能通过对整个对象进行赋值来更改。

1

这些参数基于 boost::crc_16_type

2

更改参数以匹配 boost::crc_xmodem_type

此示例必然演示了输入和输出。有一个输出成员函数 checksum,它返回 CRC 步骤的结果余数,加上任何后处理反射和/或 XOR 掩码。有几种提交输入数据以进行处理的选项:

表 9.2. boost::crc_basic 中的输入成员函数

Member Function

输入类型/样式

process_bit

单个位。

process_bits

给定字节内指定数量的位。读取从所需最高位开始。

process_byte

整个字节。字节内的位读取顺序与 get_reflect_input 一致。

process_block

范围内的所有字节。该范围由指向第一个字节的指针和指向末尾之后(字节)的另一个指针定义。

process_bytes

范围内的所有字节。该范围由指向第一个字节的指针和要读取的字节数定义。


输入函数目前不返回任何内容。

持久对象意味着数据不必存在于一个块中

unsigned  combined_crc_16( unsigned block_count, ... )
{
    1using namespace std;

    2boost::crc_basic<16>  crc1( 0x8005u, 0u, 0u, true, true );
    va_list               ap;

    va_start( ap, block_count );
    while ( block_count-- )
    {
        void const * const  bs = va_arg( ap, void const * );
        size_t const        bl = va_arg( ap, size_t );

        3crc1.process_bytes( bs, bl );
    }
    va_end( ap );

    return crc1.checksum();
}

没有 CRC 操作会抛出异常,因此在变参宏调用之间无需额外的保护。

1

C 风格的变参例程是或可能是宏。

2

这些参数基于 boost::crc_16_type

3

va_arg 调用原本在 process_bytes 调用中,但我记起函数参数之间的调用顺序无法保证,因此我需要显式的对象声明来强制执行提取顺序。

计算机对象的受输入影响的状态可以使用 get_interim_remainder 成员函数读取。对象可以使用 reset 成员函数的单参数版本加载相同类型的状态。该状态是执行在所有已输入数据上的 CRC 操作产生的余数,没有任何输出后处理。

这两个函数可以一起使用,将状态保存到持久介质并在以后恢复它。请注意,如果 Rocksoft™ 模型 CRC 算法参数在程序中不是固定的,则必须通过其他方式保存/恢复它们。

调用无参数的 reset 会将中间余数设置为对象构造时设置的 INIT 值。这允许一个计算器对象用于使用相同 CRC 标准的独立运行和不同的数据消息。


PrevUpHomeNext