是否可以有一个接受不同多项式的crc16实现?我指的是不同的多项式,同一个函数可以计算crc16,一次多项式0xA001,另一次多项式0x1D0F(例如)。
我有一个C语言的代码,对小端来说很好,使用modbus多项式(0xA001)。我选择在0xFFFF初始化crc 16:

uint16_t _crc16_update(uint8_t *Trame, uint32_t NbOctets, uint16_t Polynome)
{
  uint16_t u16CRC;

  int_t i;
  int_t j;

  u16CRC = 0xFFFF;

  for (i = NbOctets - 1; i >= 0; i--)
  {
    u16CRC = u16CRC ^ Trame[i];
    for (j = 0; j < 8; ++j)
    {
      if (u16CRC & 1)
      u16CRC = (u16CRC >> 1) ^ Polynome;
      else
      u16CRC = (u16CRC >> 1);
    }
  }

  return u16CRC;
}

但当我用其他多项式(如0x1D0F)执行这段代码时,结果对this crc 16 online calculator是错误的。
我是不是想做些不可能的事?

最佳答案

是否可以有一个接受不同多项式的crc16实现?
不。CRC发生器必须在算法的每一步使用相同的位,否则输出将不匹配。有关说明,请参见https://en.wikipedia.org/wiki/Cyclic_redundancy_check

10-04 13:45