如何使用C制作文件的校验和?我不想使用任何第三方,只是默认的c语言,而且速度非常重要(它少了50mb文件,但无论如何)
感谢
答案 0 :(得分:9)
我建议从简单开始,然后只关注引入 fast 要求,如果结果是个问题。
在解决不存在的问题上浪费了太多时间(见YAGNI
)。
简单来说,我的意思是简单地将校验和字符(这里的所有字符都是无符号)设置为零,读取每个字符并从校验和字符中减去它,直到达到文件末尾,假设您的实现是智能包装的。 / p>
类似于以下程序:
#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问题。
答案 1 :(得分:8)
答案 2 :(得分:3)
简单快捷
FILE *fp = fopen("yourfile","rb");
unsigned char checksum = 0;
while (!feof(fp) && !ferror(fp)) {
checksum ^= fgetc(fp);
}
fclose(fp)
答案 3 :(得分:2)
通常,具有良好多项式的CRC32可能是非加密哈希校验和的最佳选择。请参阅此处,原因如下:http://guru.multimedia.cx/crc32-vs-adler32/点击右侧的错误更正类别,以获得更多与crc相关的帖子。
答案 4 :(得分:0)
我建议使用BSD实现。例如,http://www.freebsd.org/cgi/cvsweb.cgi/src/usr.bin/cksum/