C文件校验和

Che*_*mmm 3 c checksum

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

谢谢

Pau*_*lin 9

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


pax*_*blo 9

我建议从简单的开始,然后只关注引入快速要求,如果事实证明是一个问题.

在解决不存在的问题上浪费了太多时间(参见参考资料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功能实际上完成了两项工作.如果你传递一个没有校验和的数据块,它将给你校验和.如果你传递一个带有校验和的块,它会给你一个良好的校验和为零,如果校验和是坏的则为非零.

这是最简单的方法,可以检测大多数随机错误.它不会检测像两个交换字符这样的边缘情况,因此,如果您需要准确,请使用像FletcherAdler这样的东西.

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

  • @Kaizer,它与简单性无关.您提供的链接中的这些函数是_hash_函数,它们的目的与校验和完全不同 - 它们的目的是最大化密钥分发之间的平衡,而不是简单地获取文件"值"的指示以进行检查(它们可以_used_为此,但在这种情况下,它们没有任何好处).此外,他们都执行比简单添加更复杂的操作,并引用问题,"速度非常重要". (2认同)
  • @Kaizer,我不确定你在谈论什么"交换",但我假设你的意思是在文件的某个地方交换字符.但是_any_ checksum(或者哈希)很容易受到无法检测到的输入值错误的影响.这是他们的本性,因为他们涉及到信息的丢失.如果使输出值更依赖于位置(例如使用djb2),则可以提高捕获其中一些问题的可能性,但这会引入额外的计算,从而减慢进程.正是对速度的强调使我专注于简单的解决方案. (2认同)