我建议从简单的开始,然后只关注引入快速要求,如果事实证明是一个问题.
在解决不存在的问题上浪费了太多时间(参见参考资料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;
}
Run Code Online (Sandbox Code Playgroud)
哪个输出:
Checksum is 0x0c
Checksum test is 0x00
Run Code Online (Sandbox Code Playgroud)
该checksum
功能实际上完成了两项工作.如果你传递一个没有校验和的数据块,它将给你校验和.如果你传递一个带有校验和的块,它会给你一个良好的校验和为零,如果校验和是坏的则为非零.
这是最简单的方法,可以检测大多数随机错误.它不会检测像两个交换字符这样的边缘情况,因此,如果您需要更准确,请使用像Fletcher或Adler这样的东西.
这两个维基百科页面都有样本C代码,您可以按原样使用,也可以分析和重新编码,以避免在您担心时出现IP问题.