C 如何检查和比较两个二进制文件之间的信息
我得到了2个二进制文件,其中一个是目录中始终生成的文件,使用: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都存在于文件
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;
}
}