#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 |
|
类静态不可变数据成员 |
|
|
POLY |
|
|
|
|
INIT |
|
|
|
|
REFIN |
|
|
|
|
REFOUT |
|
|
|
|
XOROUT |
|
|
|
由于大多数参数是在运行时指定的,您可以重用同一个计算器对象来处理具有不同参数的单独运行。该类型使用自动定义的复制/移动/赋值和析构例程。
这是一个重用的示例
std::pair<unsigned, unsigned> crc_16_and_xmodem( void const *b, std::size_t l ) { std::pair<unsigned, unsigned> result;boost::crc_basic<16> crc1( 0x8005u, 0u, 0u, true, true ); crc1.process_bytes( b, l ); result.first = crc1.checksum();
crc1 = 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 算法参数只能通过对整个对象进行赋值来更改。
此示例必然演示了输入和输出。有一个输出成员函数 checksum,它返回 CRC 步骤的结果余数,加上任何后处理反射和/或 XOR 掩码。有几种提交输入数据以进行处理的选项:
表 9.2. boost::crc_basic 中的输入成员函数
|
Member Function |
输入类型/样式 |
|---|---|
|
|
单个位。 |
|
|
给定字节内指定数量的位。读取从所需最高位开始。 |
|
|
整个字节。字节内的位读取顺序与 |
|
|
范围内的所有字节。该范围由指向第一个字节的指针和指向末尾之后(字节)的另一个指针定义。 |
|
|
范围内的所有字节。该范围由指向第一个字节的指针和要读取的字节数定义。 |
输入函数目前不返回任何内容。
持久对象意味着数据不必存在于一个块中
unsigned combined_crc_16( unsigned block_count, ... ) {using namespace std;
boost::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 );
crc1.process_bytes( bs, bl ); } va_end( ap ); return crc1.checksum(); }
没有 CRC 操作会抛出异常,因此在变参宏调用之间无需额外的保护。
C 风格的变参例程是或可能是宏。 |
|
这些参数基于 |
|
|
计算机对象的受输入影响的状态可以使用 get_interim_remainder 成员函数读取。对象可以使用 reset 成员函数的单参数版本加载相同类型的状态。该状态是执行在所有已输入数据上的 CRC 操作产生的余数,没有任何输出后处理。
这两个函数可以一起使用,将状态保存到持久介质并在以后恢复它。请注意,如果 Rocksoft™ 模型 CRC 算法参数在程序中不是固定的,则必须通过其他方式保存/恢复它们。
调用无参数的 reset 会将中间余数设置为对象构造时设置的 INIT 值。这允许一个计算器对象用于使用相同 CRC 标准的独立运行和不同的数据消息。