Я думаю, вам нужны маски 0xF, а не 0xFF. 32-битный использует 16-битную маску, половину 32, ваш 8-битный использует 8-битную маску, которая не является половиной 8, 4 бита - половина 8.
uint8_t fletcher8( uint8_t *data, uint8_t len )
{
uint8_t sum1 = 0xf, sum2 = 0xf;
while (len) {
unsigned tlen = len > 360 ? 360 : len;
len -= tlen;
do {
sum1 += *data++;
sum2 += sum1;
tlen -= sizeof( uint8_t );
} while (tlen);
sum1 = (sum1 & 0xf) + (sum1 >> 4);
sum2 = (sum2 & 0xf) + (sum2 >> 4);
}
/* Second reduction step to reduce sums to 4 bits */
sum1 = (sum1 & 0xf) + (sum1 >> 4);
sum2 = (sum2 & 0xf) + (sum2 >> 4);
return sum2 << 4 | sum1;
}
В противном случае вы создаете другую контрольную сумму, а не Fletcher. Например, sum1 выполняет контрольную сумму дополнения. В основном это 16-битный предыдущий и 4-битный в вашем случае, контрольная сумма, где биты переноса добавляются обратно. Использование в интернет-протоколах позволяет очень легко модифицировать пакет без необходимости вычисления контрольной суммы для всего пакета, вы можете складывать и вычитать только изменения из существующей контрольной суммы.
Дополнительный шаг уменьшения предназначен для углового случая, если в результате суммирования 1 + = * data = 0x1F с использованием четырехбитной схемы добавление бита переноса будет 0x01 + 0x0F = 0x10, вам необходимо добавить этот перенос бит обратно, так что вне цикла 0x01 + 0x00 = 0x01. В противном случае, что вне цикла сумма складывается в ноль. В зависимости от вашей архитектуры вы можете выполнить быстрее с чем-то вроде if (sum1 & 0x10) sum1 = 0x01; чем беглое сложение, которое может потребовать больше инструкций.
Когда это становится чем-то большим, чем просто контрольная сумма с добавленными битами переноса, это последний шаг, когда они объединяются. И если вы, например, используете только 32-битный fletcher в качестве 16-битной контрольной суммы, вы тратите впустую свое время, младшие 16 битов результата - это просто контрольная сумма запаса с добавленным битом переноса, ничего особенного. sum2 - интересное число, так как это накопление контрольных сумм sum1 (sum1 - накопление данных, sum2 - накопление контрольных сумм).