使用wikipedia Fletcher's checksum上的直接实现,我们可以获得相同的校验和,例如" BCA"和" CAB"以及" BAC"和" ACB"。
这是预期的吗? Fletcher16校验和不应该考虑块的顺序吗?
可以通过使用以下代码中显示的数据对索引进行“或”来轻松解决这个问题。
uint16_t fletcher16( uint8_t *data, int count )
{
uint16_t sum1 = 0;
uint16_t sum2 = 0;
int index;
for( index = 0; index < count; ++index )
{
//sum1 = (sum1 + data[index]) % 255; // Original
sum1 = (sum1 + index | data[index]) % 255; // The "fix"
sum2 = (sum2 + sum1) % 255;
}
return (sum2 << 8) | sum1;
}