You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中检测二进制文件内容是否存在于其他二进制文件?是否用内置函数?

用C语言内置函数实现二进制文件内容匹配的可行性分析

当然可以用C语言的内置函数来搭建这个功能的核心部分——甚至这是非常推荐的做法!内置函数经过编译器优化,在IO效率和可靠性上都比自己从零写底层逻辑靠谱得多,下面给你拆解下具体怎么用,以及哪些地方需要补充自定义逻辑:

1. 二进制文件读取:必须用内置函数

读取二进制文件的核心操作,直接依赖C标准库的fopen()、fread()、fseek()、ftell()这些内置函数就够了:

  • 用fopen()打开文件时记得指定"rb"模式,避免系统自动转换换行符(二进制文件不需要这个处理);
  • 用fseek()+ftell()可以快速获取文件大小,方便分配内存缓冲区;
  • 最后用fread()把文件内容读到内存里。

举个简单的读取示例:

FILE *fp = fopen("target.bin", "rb");
if (!fp) {
    perror("Failed to open file");
    return -1;
}

// 获取文件大小
fseek(fp, 0, SEEK_END);
long file_size = ftell(fp);
rewind(fp);

// 分配内存存储文件内容
unsigned char *file_buf = malloc(file_size);
if (!file_buf) {
    perror("Failed to allocate memory");
    fclose(fp);
    return -1;
}

// 读取文件到缓冲区
size_t read_bytes = fread(file_buf, 1, file_size, fp);
if (read_bytes != file_size) {
    fprintf(stderr, "Only read %zu bytes out of %ld\n", read_bytes, file_size);
}

fclose(fp);

2. 内容匹配:内置函数做基础,自定义逻辑补全

C标准库没有直接的“二进制内容全匹配/子匹配”内置函数,但可以用memcmp()这个内置函数来简化核心的内存对比操作:

  • 如果是检测整个文件内容是否完全存在于另一个文件中,可以先对比两个文件的大小(小文件不可能包含大文件),然后遍历大文件的缓冲区,用memcmp()逐块对比和小文件缓冲区大小一致的内存块;
  • 如果是要检测部分内容匹配,你需要自己实现匹配算法(比如KMP、Boyer-Moore),但中间的内存片段对比依然可以用memcmp()来高效完成。

举个简单的全文件匹配示例:

// 参数:buf1是待检测文件的缓冲区,size1是其大小;buf2是目标文件缓冲区,size2是其大小
int is_file_content_exists(unsigned char *buf1, long size1, unsigned char *buf2, long size2) {
    if (size1 > size2) return 0; // 待检测文件更大,不可能存在

    for (long i = 0; i <= size2 - size1; i++) {
        if (memcmp(buf1, buf2 + i, size1) == 0) {
            return 1; // 找到匹配
        }
    }
    return 0;
}

3. 注意事项

  • 处理大文件时,不要一次性把整个文件读入内存,应该分块读取和匹配,避免内存溢出——这时候依然用fread()分块读取,结合匹配逻辑逐块处理;
  • 内置函数的错误处理一定要做(比如fopen()返回NULL、malloc()失败、fread()读取字节数不足),不然程序很容易崩溃或者出现奇怪的错误。

总结下来:C语言的内置函数是实现这个需求的绝佳基础,能帮你搞定最核心的文件IO和内存对比工作,剩下的匹配逻辑只需要你基于这些函数来搭建就好,既高效又符合C语言的底层特性。

内容的提问来源于stack exchange,提问作者CookieMonster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:09:15