2016-12-02 5 views
-2

Ich habe ein Programm, das einen Hash-Schlüssel aus einer Datei generieren und zeigt diesen Hash. Ich versuche zu überprüfen, ob der Ergebnis-Hash-Schlüssel dem erwarteten Hash-Schlüssel entspricht. Aber das funktioniert nicht, denn wenn der Hash-Schlüssel derselbe wie der erwartete ist, bekomme ich die Nachricht "Hash is different". Siehst du, was nicht stimmt?Progrma sagt, dass Hash ist anders, aber es ist nicht

Einige Variablen im Zusammenhang mit der Frage.

BYTE rgbFile[BUFSIZE]; 
    DWORD cbRead = 0; 
    BYTE rgbHash[MD5LEN]; 
    DWORD cbHash = 0; 
    CHAR rgbDigits[] = "abcdef"; 
    PCSTR filename = "c:\\Users\\jax\\Desktop\\files\\test.txt"; 
    CHAR hashExpected[] = "4ab5d20e55ef73e4f412d73c2a201e"; 

Im folgenden Code ist, wo es eine Meldung wie „Hash der Datei ist‚4ab5d20e55ef73e4f412d73c2a201e zeigt‘und wo ich den Vergleich haben:

 DWORD i; 
     CHAR hashResult= ""; 
     printf("Hash of file %s is: ", filename); 
     for (i = 0; i < cbHash; i++) 
     { 
      printf("%c%c", 
        rgbDigits[rgbHash[i] >> 4], 
        rgbDigits[rgbHash[i] & 0xf]); 
      hashResult = rgbDigits[rgbHash[i] >> 4]; 
      hashResult += rgbDigits[rgbHash[i] & 0xf]; 

     } 

     printf("\n");  
     printf(hashResult); 
     if(hashResult == hashExpected){ 
      printf("hash is the same"); 
     } 
     else{ 
      printf("hash is different"); 
     } 

Update: Auch bekomme ich immer die Meldung“ Falsche „:

 DWORD i; 
     CHAR hashResult[] = {}; 
     printf("Hash of file %s is: ", filename); 
     for (i = 0; i < cbHash; i++) 
     { 
      printf("%c%c", 
        rgbDigits[rgbHash[i] >> 4], 
        rgbDigits[rgbHash[i] & 0xf]); 
      hashResult[i] = rgbDigits[rgbHash[i] >> 4]; 
      hashResult[i] += rgbDigits[rgbHash[i] & 0xf]; 


     } 
     if(hashResult == hashExpected){ 
      printf("Hash is the same"); 
     } 
     else{ 
      printf("Hash is different"); 
     } 

aktualisiert:

BOOL test(char array1[] , char array2[]) 
{ 
    int i; 
    for(i = 0; array1[i] && array2[i]; ++i) 
    { 
     if(array1[i] != array2[i]) 
     { 
      return(FALSE); 
     } 
    } 
    return(TRUE); 
} 
+4

Der angezeigte Code sollte nicht ohne Warnungen kompiliert werden. Sie haben sowohl 'CHAR a [] =" ... ";' und 'CHAR b =" ";'. Sie können Zeichenketten für Gleichheit nicht mit '==' vergleichen, aber Sie tun es. –

+0

Denken Sie darüber nach, wie Sie zwei Arrays vergleichen würden: Element für Element. Zwei Arrays sind nur dann gleichwertig, wenn _all_ die entsprechenden Elemente gleich sind. Sie können nicht einfach einen Vergleich machen und dann sofort wissen, dass "Hash ist derselbe", Sie müssten warten, bis Sie wissen, dass alle gleich sind. Wenn Sie feststellen, dass ein Element nicht übereinstimmt, dann wissen Sie sofort, dass sie _nicht_ gleich sind. – e0k

+0

Nochmals vielen Dank für Ihre Antwort. Für das, was ich mit Ihrer Hilfe verstanden habe, sollte der Code, den ich jetzt aktualisiere, funktionieren. Wenn er zwei Buchstaben unterscheidet, gibt er false zurück, und wenn alles icual ist, wird er wahr zurückgegeben. Aber ich bekomme immer die Nachricht "Hash is different" und sie sind icual. – Jax

Antwort

2

Sie haben einige bedeutende Probleme mit Typen, zumindest im Vergleich

if(hashResult == hashExpected){ 

hashResult ist ein CHAR und hashExpected (ohne Array-Index) ist die Adresse im Speicher, wo eine Reihe von CHAR beginnt. Sie müssen die tatsächlichen Werte vergleichen, die in diesem Array gespeichert sind, und nicht nur eine Adresse, an der sie sich befindet.

Edit: Ich bemerkte hashResult ist ein CHAR, und kein Array, wie zuvor geschrieben. Wie auch immer, der hashResult == hashExpected Vergleich ist unangemessen.

+0

Danke für Ihre Antwort. Soweit ich weiß, lag das Problem darin, dass hashResult ohne Arrayindex gespeichert wurde. Jetzt tue ich das, aber das Ergebnis ist das gleiche, eine Nachricht, die sagt "Hash is different". – Jax

+0

Sie Adressen immer noch in der if-Anweisung vergleichen, während Sie die Werte im Array wie 'if (hashResult [i] == hashExpected [i]) {'beim iterieren durch das Array zu vergleichen. Oder verwenden Sie eine String-Vergleichsfunktion, wenn die Char-Arrays "\ 0" terminiert sind. –

+0

Vielen Dank, dass Sie versucht haben, zu helfen. Ich denke, das sollte nun funktionieren, weil ich durch die Arrays iteriere und überprüfe, ob jedes Element für den anderen identisch ist. Aber es zeigt immer "Hash ist der gleiche", auch wenn ich den HashExected zu einem anderen ändere. – Jax

Verwandte Themen