c++ - 无法弄清楚如何计算CRC7

标签 c++ c crc

我需要计算一系列字节的 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/
我不能只从中复制粘贴一个函数,因为我需要它以无符号字符的形式返回值。

我哪里会犯错?

最佳答案

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

下面的异或运算crc使用 8 位消息,但使用 poly << 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

关于c++ - 无法弄清楚如何计算CRC7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49672644/

相关文章:

c++ - 崇高文本 3 中的 ISO C++ 错误禁止可变长度数组

c++ - 是否需要注意非错误提示?好像找不到包 ‘***’?

c++ - CRC4 INTERLAKEN和ITU查找表生成

c++ - POSIX cksum 和 Boost.CRC

crc - 反向消息CRC计算

c++ - 被 (char *) cast 搞糊涂了

c++ - 我们如何使用 OpencV StereoSGBM (C++) 显示单个视差图?

C 中的 Caesar Cypher 给出不正确的输出

c - 编译器如何计算 x=x+1 以及如何在汇编中表示?

c - 在C中是否可以控制函数参数的对齐方式?