2016-05-21 2 views
0

в основном пытаются сделать анти вирус, но все это я получаю при попытке чтения зараженного файла в буфер EOF ... это JPG, и я понятия не имею, как исправить этупытается прочитать файл

о функциях файлов я разрешено использовать: Fread/FWRITE fgets fputs fclose Еореп fgetc fputc fscanf 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; 
} 
+0

Знак_знакается прекрасно, но infec_c имеет проблемы – teggr234

+0

Что происходит, когда вы запускаете программу? какой вид вы ожидаете, и что вы получаете вместо этого? –

+0

- Erik Nyquist Я ожидаю получить двоичные значения jpg-изображения (используя getFile), а затем проверить, существует ли в файле знак (сигнатура вируса), подпись вируса идет отлично, но изображение не , – teggr234

ответ

1

EOF - это специальное целочисленное значение, возвращаемое некоторыми функциями ввода, чтобы указать, что конец файла достигнут, но он не является частью данных файла. Поэтому ваш fread() никогда не будет хранить символ EOF во входном буфере, который вы предоставили. Однако, если ваши возможности реализации C подписываются по умолчанию char s, как многие из них, то есть значение char, которое численно равно EOF (обычно -1).

Если какой-либо файл содержит этот байт, ваш код будет неверно истолковывать его как обозначение конца этого файла. Если это первый байт в любом файле, программа будет неправильно интерпретировать файл как пустой.

Поскольку вы анализируете двоичные файлы,

  1. Я рекомендую использовать буферы unsigned char, а не по умолчанию char.

  2. Все возможные значения байтов могут отображаться в файлах данных, поэтому вы не можете идентифицировать конец данных по значению любого байта внутри.

Возможно, getFile() должен возвращать структуру, которая содержит как указатель на буфер и его размер.

+0

, поэтому использование символа unsigned не приведет к потере байтов файла при его хранении? спасибо за помощь, было бы очень полезно, если бы вы могли ответить на этот последний вопрос -John Bollinger --- edit: по-прежнему не работает, теперь получают ошибки (runtime) – teggr234

+1

@ teggr234, используя 'unsigned char' вместо' char' подчеркивает что вы изучаете двоичные данные, а не символьные данные, и это изменяет * интерпретацию * бит, считанных из файла, но никакие биты не теряются таким образом. Во всяком случае, рекомендация использовать 'unsigned char' - это только рекомендация. Решение этой проблемы не зависит от нее. –

+0

да, все равно не получится. Я по-прежнему получаю EOF по какой-то причине, и я понятия не имею, почему .. – teggr234

0

Как и любой другой ответ, вы также должны отправить длину файла и перебрать его, а не ждать EOF.

Кроме того, в вашем getFile() функции, когда вы определяете длину файла вы не должны читать побайтно, вы можете просто отправить filelen в fread() как так

fread(buffer, sizeof(char), filelen, file); 

fread теперь гласит filelen элементы данных, каждый из которых имеет размер символа (вместо этого можно записать 1) из потока file в buffer.