【问题标题】:Can't figure out how to calculate CRC7不知道如何计算 CRC7
【发布时间】:2018-09-15 07:01:32
【问题描述】:

我需要为一系列字节计算 CRC7
我的多项式 x^7+x^3+1
这是我写的一个函数:

unsigned char CRC7(const unsigned char message[], const unsigned int length)
{
    const unsigned char poly = 0b10001001;
    unsigned char crc = 0;

    for (int i = 0; i < length; i++ )
    {
        crc ^= message[i];

        for (int j = 0; j < 8; j++)
            crc = crc & 0x1 ? (crc >> 1) ^ poly : crc >> 1;
    }

    return crc;
}

但它给出了错误的结果。例如 0x82 和 0x04 返回 0x57,而它必须是 0x61
这个在线计算器适合我:http://www.ghsi.de/pages/subpages/Online%20CRC%20Calculation/
我不能只是从中复制粘贴一个函数,因为我需要它将值作为无符号字符返回。

我会在哪里犯错?

【问题讨论】:

  • 我认为这些移位应该是左移位 (&lt;&lt;),并且您应该检查是否设置了 msb (crc &amp; 0x80)。
  • 试试这个网站(我没有检查是否正确):github.com/hazelnusse/crc7/blob/master/crc7.cc
  • 如果该功能适合您,那么您可以使用它。从// Convert binary to ASCII 开始,您应该能够生成您想要的输出。
  • 与你的问题无关,如果你能负担得起 128 字节的额外 ROM 使用,生成一个 128 位大查找表可能是正确的解决方案。
  • CRC 规范需要的不仅仅是多项式。您需要位顺序、初始化和最终异或值(有时最终异或值为零,这就像没有那一步)。

标签: c++ c crc


【解决方案1】:

要模仿referenced site,左移并仅使用crc 的7 位。

下面的 xor 的 crc 带有 8 位消息,但通过使用 poly &lt;&lt; 1,可以有效地计算 7 个最高有效位的 CRC。

unsigned char CRC7(const unsigned char message[], const unsigned int length) {
  const unsigned char poly = 0b10001001;
  unsigned char crc = 0;
  for (unsigned i = 0; i < length; i++) {
     crc ^= message[i];
     for (int j = 0; j < 8; j++) {
      // crc = crc & 0x1 ? (crc >> 1) ^ poly : crc >> 1;       
      crc = (crc & 0x80u) ? ((crc << 1) ^ (poly << 1)) : (crc << 1);
    }
  }
  //return crc;
  return crc >> 1;
}

当然const unsigned char poly = 0b10001001;可以替换

const unsigned char poly = 0b10001001;
const unsigned char poly2 = 0b10001001 << 1;

crc = (crc & 0x80u) ? ((crc << 1) ^ poly2) : (crc << 1);

测试

int main(void) {
  printf("%x\n", CRC7((unsigned char*)"\x82\x04",2));
}

输出

61

【讨论】:

  • 非常感谢!我似乎将CRC7与CRC8混淆了。我认为唯一的区别是我们没有计算最重要的位。
  • @EugeneMart:这是 7 位和 8 位 CRC 之间的唯一区别。其他差异与 CRC 多项式阶数无关。
猜你喜欢
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多