Я бы предложил начать с simple , а затем беспокоиться только о введении требования fast , если оно окажется проблемой.
Слишком многовремя потрачено на решение проблем, которые не существуют (см. YAGNI
).
Под простым я подразумеваю просто начинать символ контрольной суммы (все символы здесь без знака) с нуля, читая каждый символ и вычитая егоот символа контрольной суммы до достижения конца файла, при условии, что ваша реализация разумно переносится.
Что-то похожее на следующую программу:
#include <stdio.h>
unsigned char checksum (unsigned char *ptr, size_t sz) {
unsigned char chk = 0;
while (sz-- != 0)
chk -= *ptr++;
return chk;
}
int main(int argc, char* argv[])
{
unsigned char x[] = "Hello_";
unsigned char y = checksum (x, 5);
printf ("Checksum is 0x%02x\n", y);
x[5] = y;
y = checksum (x, 6);
printf ("Checksum test is 0x%02x\n", y);
return 0;
}
, которая выводит:
Checksum is 0x0c
Checksum test is 0x00
Эта функция checksum
фактически выполняет обе работы.Если вы передадите ему блок данных без контрольной суммы в конце, он даст вам контрольную сумму.Если вы передадите ему блок с контрольной суммой в конце, он даст вам ноль для хорошей контрольной суммы или ненулевой, если контрольная сумма неверна.
Это самый простой подход, который обнаружит большинство случайных ошибок.,Он не будет обнаруживать крайние случаи, как два замененных символа, поэтому, если вам нужна даже больше достоверность, используйте что-то вроде Fletcher или Adler .
На обеих этих страницах Википедии есть пример кода C, который вы можете использовать как есть, либо анализировать и перекодировать, чтобы избежать проблем с IP, если вас это беспокоит.