我需要使用最优,它计算数组的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,0,0,0,0,0,0,0,0,0,0};
如何将crc_optimal应用于此序列?
我应该只转换每个0到0x30和每个1到0x31吗?在这种情况下,如何将结果crc恢复为二进制形式?
谢谢。
编辑:将数组类型从浮点更改为int,因为这不是必要的部分。看起来挑战在于,我使用的数组长度不是8的倍数。
发布于 2014-12-07 16:02:19
要使用逐字节的CRC例程,您需要将您的位序列转换为字节序列。比特的顺序取决于CRC的顺序,在这种情况下(CCITT-false)没有反映出来,所以您首先认为比特流是最重要的位。然后,您的序列的前八位变成0x85。如果它是一个反射CRC (例如真正的CCITT 16位CRC),那么前八位变成0xa1。
如果如示例所示,位数不是8的倍数,那么您需要编写自己的CRC例程来处理剩下的1到7位。对于CCITT-false,在这种情况下,一个稍微明智的CRC应该是如下所示,其中bit是转换为整数0或1的浮点数:
crc = ((bit << 15) ^ crc) & 0x8000 ? (crc << 1) ^ 0x1021 : crc << 1;
// ... repeat for remaining bits ...
crc &= 0xffff;如果这是真正的CCITT 16位CRC,它的初始化值为零,您可以做一些不同的事情来处理额外的比特。在这种情况下,可以将足够多的零添加到流的前面,使其为8的倍数。初始化为零的前导零使CRC保持为零。因此,对于CCITT 16,它反映了,你的17位数据变成了0x80,0x50,0x00。
https://stackoverflow.com/questions/27344322
复制相似问题