C 如何检查和比较两个二进制文件之间的信息

C 如何检查和比较两个二进制文件之间的信息,c,windows,file,binary,C,Windows,File,Binary,我得到了2个二进制文件,其中一个是目录中始终生成的文件,使用: while ((en = readdir(dr)) != NULL) 注意-我的操作系统是WINDOWS 10 另一个是我从主要参数获取的不可更改文件: argv[2] 我想检查第一个文件的二进制代码,并检查argv[2]的所有二进制代码是否都存在于第一个文件中的任何位置 例如: 文件1:781238971237891237829823889123789123789123 文件2:8298238 如您所见,所有文件2都存在于文件

我得到了2个二进制文件,其中一个是目录中始终生成的文件,使用:

while ((en = readdir(dr)) != NULL)
注意-我的操作系统是WINDOWS 10

另一个是我从主要参数获取的不可更改文件:

argv[2]
我想检查第一个文件的二进制代码,并检查
argv[2]
的所有二进制代码是否都存在于第一个文件中的任何位置

例如:

文件1:781238971237891237829823889123789123789123

文件2:8298238

如您所见,所有文件2都存在于文件1中的任何位置,因此它应该返回true。 其他的都是假的

示例之间的唯一区别是,示例不是文本的和它的二进制的

我希望函数能够获取2个文件,第一个文件和第二个文件。 正如我所说,回报率必须是bool

到目前为止我试过的代码:(90%的问题出在名为“比较两个二进制文件””的函数中)


第一步:
charch1,ch2-->
intch1,ch2
fgetc()
通常返回257个不同的值。您编写了“90%的问题在于名为“比较两个二进制文件”的函数“。请回答您的问题并添加有关该问题的更多详细信息:是否有错误?错误的输出/结果?您使用什么输入?一些一般提示:假设
file2
很小,我建议将
file2
的全部内容读入内存。我建议以至少与
file2
大小相同的块读取
file1
,并始终将与
file2
大小相对应的前一块(最后一部分)放在下一块之前。然后,您可以轻松地在内存中搜索您的模式。如果您使用GNU libc,您可以使用非标准函数[
memmemmem
])。“示例之间的唯一区别是,示例不是文本的,也不是二进制的”-这有什么关系?
int normalScan(int argc, char** argv) {
    DIR* dr = NULL;
    struct dirent* en;

    dr = opendir(argv[1]);

    if (dr == NULL) {
        printf("errno: %d \n", errno);
        printf("The entered directory seems to have a problem, please try again! '%s'\n", argv[1]);
        printf("Press Enter to quit! :D \n");
        getchar();
        return 0;
    }

    if (dr) {
        while ((en = readdir(dr)) != NULL) {
            if (strcmp(en->d_name, ".") != 0 && strcmp(en->d_name, "..") != 0)
            {
                bool result = false;
                FILE* checkedFile = NULL;
                FILE* virusSignatureBinary = NULL;
                char startOfFolderToCheckPath[1000] = "";
                strcat(startOfFolderToCheckPath, argv[1]);
                strcat(startOfFolderToCheckPath, "/");
                strcat(startOfFolderToCheckPath, en->d_name);
                // printf("%s \n", startOfFolderToCheckPath);
                checkedFile = fopen(startOfFolderToCheckPath, "rb");
                virusSignatureBinary = fopen(argv[2], "rb");


                if (checkedFile == NULL) {
                    printf("errno: %d \n", errno);
                    printf("The entered file seems to have a problem, please try again! '%s'\n", (argv[1], en->d_name));
                    printf("Press Enter to quit! :D \n");
                    getchar();
                    return 0;
                }

                if (virusSignatureBinary == NULL) {
                    printf("errno: %d \n", errno);
                    printf("The entered file seems to have a problem, please try again! '%s'\n", argv[2]);
                    printf("Press Enter to quit! :D \n");
                    getchar();
                    return 0;
                }

                
                // result = compare_two_binary_files(checkedFile, virusSignatureBinary);
                

                if(result)
                {
                    printf("%s - infected! \n", startOfFolderToCheckPath);
                }
                else
                {
                    printf("%s - Clean \n", startOfFolderToCheckPath);
                }
                fclose(checkedFile);
                fclose(virusSignatureBinary);
            }

        }
        closedir(dr);
    }
    return(0);
}

bool compare_two_binary_files(FILE* fp1, FILE* fp2)
{
    char ch1, ch2;
    int flag = 0;

    while (((ch1 = fgetc(fp1)) != EOF) && ((ch2 = fgetc(fp2)) != EOF))
    {
        // if equal, continue to check for equalty more in the rest of the code
        if (ch1 == ch2)
        {
            flag = 1;
            // continue;
        }
        // if not, (no equal characters found) break the check, and return flag as 0 (which says its false in total)
        else
        {
            fseek(fp1, -1, SEEK_CUR);
            flag = 0;
            break;
        }
    }

    if (flag == 0)
    {
        return false;
    }
    else
    {
        return true;
    }
}