是否可以有一个接受不同多项式的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。