gpt4 book ai didi

c - 尝试读取文件

转载 作者:行者123 更新时间:2023-11-30 15:08:24 25 4
gpt4 key购买 nike

基本上是在尝试制作防病毒软件,但是当我尝试将受感染的文件读入缓冲区时,我得到的只是 EOF...它是一个 jpg,我不知道如何解决这个问题

关于我可以使用的文件函数:读取/写入弗格茨输出量关闭福彭弗 git 弗普特克扫描仪fprintf

int fullScan(FILE* sign, FILE* infected);
char* getFile(FILE* file);

int main(int argc, char** argv)
{
FILE* sign = fopen("KittenVirusSign", "rb");
FILE* infected = fopen("kitten_frog.jpg", "rb");
int j = 0;
if (infected == NULL)
{
printf("couldn't open the file (suspicious file)");
return -1;
}
if (sign == NULL)
{
printf("couldn't open the file (virus signature)");
return -1;
}

j = fullScan(sign, infected);
return 0;
}

int fullScan(FILE* sign, FILE* infected)
{
char* sign_c = NULL;
char* infec_c = NULL;
int infect_res = -1;
int sign_len = 0;
int infec_len = 0;
int i = 0;
int j = 0;
sign_c = getFile(sign);
infec_c = getFile(infected);
while (1)
{

if (*(infec_c + i) == *(sign_c + j))
{
infect_res = 1;
if (*(sign_c + j) == EOF)
{
break;
}
else if (*(infec_c + i) == EOF)
{
infect_res = -1;
break;
}
i++;
j++;
continue;
}
else if (*(infec_c + i) != *(sign_c + j))
{
if (*(infec_c + i) == EOF || *(sign_c + j) == EOF)
{
break;
}
i++;
j = 0;
infect_res = -1;
}

}
fclose(infected);
free(sign_c);
free(infec_c);
return infect_res;
}


char* getFile(FILE* file)
{
char* buffer;
long filelen;
int i;
fseek(file, 0, SEEK_END);
filelen = ftell(file);
fseek(file, 0, SEEK_SET);
buffer = (char *)malloc((filelen + 1)*sizeof(char));
for (i = 0; i < filelen; i++)
{
fread(buffer + i, sizeof(char), 1, file);
}

return buffer;
}

最佳答案

EOF是一些输入函数返回的特殊整数值,表示已到达文件末尾,但它不是文件数据的一部分。因此,您的 fread() 永远不会将 EOF 字符存储到您提供的输入缓冲区中。但是,如果您的 C 实现像许多人一样采用带符号的默认 char 功能,则存在一个在数值上等于 EOFchar 值(通常为-1)。

如果任一文件碰巧包含该字节,那么您的代码会将其误解为指定该文件的结尾。如果它恰好是任一文件中的第一个字节,则程序会将文件误解为空。

由于您正在分析二进制文件,

  1. 我建议使用 unsigned char 缓冲区,而不是默认的 char

  2. 所有可能的字节值都可以出现在文件数据中,因此您无法通过其中任何字节的值来识别数据的结尾。

也许,getFile()应该返回一个包含指向缓冲区的指针及其大小的结构。

关于c - 尝试读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37367532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com