C文件校验和

时间:2010-08-12 00:57:41

标签: c checksum

如何使用C制作文件的校验和?我不想使用任何第三方,只是默认的c语言,而且速度非常重要(它少了50mb文件,但无论如何)

感谢

5 个答案:

答案 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函数实际上两个作业。如果你传递一个没有校验和的数据块,它将给你校验和。如果你传递一个带有校验和的块,它会给你一个良好的校验和为零,如果校验和是坏的则为非零。

这是最简单的方法,可以检测大多数随机错误。它不会检测两个交换字符等边缘情况,因此,如果您甚至需要更多准确性,请使用FletcherAdler之类的内容。

这两个维基百科页面都有样本C代码,您可以按原样使用,也可以分析和重新编码,以避免在您担心时出现IP问题。

答案 1 :(得分:8)

  1. 确定您要使用的算法(CRC32是一个示例)
  2. 在维基百科或其他来源上查找算法
  3. 编写实现该算法的代码
  4. 如果/当代码未正确实施算法时,在此处发布问题
  5. 利润?

答案 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/