2016-05-15 2 views
1

Le but de la fonction est d'obtenir 2 flux de fichiers, une signature et un fichier numérisé. Il est censé scanner le fichier numérisé, et si la signature est dedans, il retournera 1 (fichier infecté). J'ai essayé d'utiliser le même fichier que les deux paramètres et il a toujours retourné 0, j'ai essayé le débogage et je ne peux pas obtenir le problème.Numériser un fichier pour une signature (en utilisant fread)

(fonction sizeOfFile renvoie la taille du fichier en octets)

int scanFile(FILE* signatureFile, FILE* scannedFile) 
{ 
    const size_t signatureSize = sizeOfFile(signatureFile); 
    const size_t scannedFileSize = sizeOfFile(scannedFile); 
    size_t l1 = 0; 
    size_t l2 = 0; 
    unsigned char currChar = ' '; 
    unsigned char currSignatureChar = ' '; 
    int i = 0; 
    unsigned char signatureFirstChar = fread(&signatureFirstChar, 1, 1, signatureFile); 
    if (scannedFileSize >= signatureSize) 
    { 
     while ((l1 = fread(&currChar, 1, 1, scannedFile)) != 0) 
     { 
      if (currChar == signatureFirstChar) 
      { 
       fseek(scannedFile, -1, SEEK_CUR); 
       fseek(signatureFile, 0, SEEK_SET); 
       currSignatureChar = signatureFirstChar; 
       while (currChar == currSignatureChar) 
       { 
        if ((l1 = fread(&currChar, 1, 1, scannedFile)) != 0 && (l2 = fread(&currSignatureChar, 1, 1, signatureFile)) != 0) 
        { 
         i++; 
         if (i == signatureSize) 
         { 
          return 1; 
         } 
        } 
        else 
        { 
         break; 
        } 
       } 
      } 
     } 

    } 
    else 
    { 
     return 0; 
    } 
    return 0; 
} 

Toute aide serait appréciée.

+0

Note: Il est raisonnable de supposer la taille d'un fichier de signature correspond à un 'size_t' et de déterminer sa longueur avant de comparer. La taille du fichier analysé n'a pas besoin d'être dans un 'size_t', et n'a pas besoin d'être déterminée avant la comparaison. – chux

Répondre

2

La fonction fread() renvoie le nombre d'objets lus. Vous assignez la valeur de retour à votre signatureFirstChar quand vous faites

unsigned char signatureFirstChar = fread(&signatureFirstChar, 1, 1, signatureFile); 

changement à

unsigned char signatureFirstChar; 
fread(&signatureFirstChar, 1, 1, signatureFile); 
+1

bonne réponse, sauf que la valeur renvoyée par 'fread()' doit être vérifiée (dans ce cas, elle doit être la même que le paramètre 3, IE 1. Toute autre valeur renvoyée indique une erreur, comme EOF ou le signal s'est produit ou .. . – user3629249