我需要使用 boost::crc_optimal ,它计算数组(字符?)的 crc。 使用示例:
// This is "123456789" in ASCII
unsigned char const data[] = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39 };
std::size_t const data_len = sizeof( data ) / sizeof( data[0] );
// The expected CRC for the given data
boost::uint16_t const expected = 0x29B1;
boost::crc_optimal<16, 0x1021, 0xFFFF, 0, false, false> crc_ccitt2;
crc_ccitt2 = std::for_each( data, data + data_len, crc_ccitt2 );
assert( crc_ccitt2() == expected );
问题是我正在处理的数据是一系列 0 和 1。具体例子:
int 数据 [] = {1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0};
如何将 crc_optimal 应用于此序列?
我应该只将每个 0 转换为 0x30 并将每个 1 转换为 0x31 吗?在那种情况下,如何将生成的 crc 恢复为二进制形式?
谢谢。
编辑:将数组类型从 float 更改为 int,因为这不是必要的部分。 看起来挑战在于我正在处理长度不是 8 的倍数的数组。
最佳答案
要使用按字节的 CRC 例程,您需要将位序列转换为字节序列。位的顺序取决于 CRC 的顺序,在这种情况下 (CCITT-false) 未反射(reflect)出来,因此您认为位流首先是最高有效位。然后序列的前八位变为 0x85
。如果它是反射 CRC(例如真正的 CCITT 16 位 CRC),则前八位变为 0xa1。
如果如示例所示,位数不是八的倍数,则您需要编写自己的 CRC 例程来处理剩余的一到七位。在这种情况下,对于 CCITT-false,逐位 CRC 看起来像下面的 CCITT-false,其中 bit
是转换为整数 0 或 1 的浮点值:
crc = ((bit << 15) ^ crc) & 0x8000 ? (crc << 1) ^ 0x1021 : crc << 1;
// ... repeat for remaining bits ...
crc &= 0xffff;
如果这是具有零初始化值的真正的 CCITT 16 位 CRC,您可以做一些不同的事情来处理额外的位。在这种情况下,您可以将足够多的零附加到流的前面,使其成为八的倍数。零初始化的前导零使 CRC 为零。所以对于反射(reflect)出来的CCITT CRC-16,你的17位数据变成了0x80
, 0x50
, 0x00
。
关于c++ - 如何将 boost::crc_optimal 与二进制数组一起使用(0's and 1' s 的数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27344322/