crc 16实现接受不同的多项式

时间:2017-12-05 17:50:53

标签: c crc16

是否可以使用接受不同多项式的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上的错误问题。

我想做一些不可能的事吗?

1 个答案:

答案 0 :(得分:1)

  

是否可以使用接受不同多项式的crc16实现?

没有。 CRC生成器必须在算法的每一步使用相同的位,否则输出将不匹配。有关说明,请参阅https://en.wikipedia.org/wiki/Cyclic_redundancy_check