【问题标题】:How to use boost::crc_optimal with a binary array (array of 0's and 1's)如何将 boost::crc_optimal 与二进制数组(0 和 1 的数组)一起使用
【发布时间】:2014-12-07 15:39:43
【问题描述】:

我需要使用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 的倍数的数组。

【问题讨论】:

  • 为什么要浮动?!请使用 char 或其他类似 int 的东西。您可以将每 8 个数据元素转换为 1 个字节...
  • @deviantfan 谢谢,看来这是要走的路

标签: c++ boost binary crc


【解决方案1】:

要使用逐字节 CRC 例程,您需要将位序列转换为字节序列。位的顺序取决于 CRC 的顺序,在这种情况下(CCITT-false)没有反映,因此您首先考虑位流是最高有效位。然后序列的前八位变为0x85。如果是反射 CRC(例如真正的 CCITT 16 位 CRC),那么前 8 位变为 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,您可以做一些不同的事情来处理额外的位。在这种情况下,您可以将足够的零附加到流的 front 以使其成为 8 的倍数。零初始化的前导零使 CRC 为零。所以对于反映的CCITT CRC-16,你的17位数据变成0x800x500x00

【讨论】:

  • 谢谢。我没想到答案对 crc 多项式如此具体。我认为这仅与数据类型和转换有关。知道具体实现是:boost::crc_optimal crc_epc; 有什么要补充的吗?
  • 谢谢。我希望你是对的,但你确定初始化为零吗?我以为这是第三个参数,在这种情况下是 0x09。
  • 啊,我看错了。初始化不为零。您需要对末尾的位进行自己的按位 CRC。
  • 谢谢,您当然是对的,我说希望的原因是我希望您将 0x09 误读为 0x00,但希望我错了。我不打算盲目使用你给我的信息。
猜你喜欢
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
  • 2015-03-24
  • 2012-02-21
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
  • 2022-01-03
相关资源
最近更新 更多