如何使用C对文件进行校验和?我不想使用任何第三方,只是默认的C语言,速度也非常重要(它的文件少于50mb,但无论如何)

谢谢

最佳答案

我建议先从简单的需求开始,然后才担心引入快速需求,如果事实证明这是一个问题。

解决不存在的问题浪费了太多时间(请参阅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函数实际上完成了这两项工作。如果您在最后传递一个没有校验和的数据块,它将为您提供校验和。如果将最后一个带有校验和的块传递给它,则对于良好的校验和,您将得到零;如果校验和不好,它将为您提供非零。

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

这两个Wikipedia页面均包含示例C代码,您可以直接使用,也可以进行分析和重新编码以避免IP问题。

09-28 06:58
查看更多