如何将boost :: crc_optimal与二进制数组一起使用(0' s和1' s的数组)

时间:2014-12-07 15:39:43

标签: c++ boost binary crc

我需要使用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 data [] = {1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0};

如何将crc_optimal应用于此序列?

我应该将每个0转换为0x30并将每个1转换为0x31吗?在这种情况下,如何将生成的crc恢复为二进制形式?

谢谢。

编辑:将数组类型从float更改为int,因为这不是必不可少的部分。 看起来挑战在于我正在使用长度不是8的倍数的数组。

1 个答案:

答案 0 :(得分:1)

要使用逐字节CRC的例程,需要将位序列转换为字节序列。位的顺序取决于CRC的顺序,在这种情况下(CCITT-false)不会被反映,因此您认为位流是最重要的位。然后序列的前八位变为0x85。如果它是反射的CRC(例如真正的CCITT 16位CRC),则前8位变为0xa1。

如果如在所示的示例中,位数不是8的倍数,那么您将需要编写自己的CRC例程来处理剩余的1到7位。在这种情况下,逐位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保留为零。因此,对于反映的CCITT CRC-16,您的17位数据变为0x800x500x00