2016-12-02 45 views
-2

我有一個程序從一個文件生成一個哈希鍵,並顯示哈希。我試圖檢查結果散列鍵是否對應於預期的散列鍵。但是這不起作用,因爲當散列鍵與期望的相同時,我會得到「散列不同」的消息。你看到什麼是不正確的?Progrma說哈希是不同的,但它不是

一些與問題有關的變量。

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"; 

在下面的代碼就是它顯示像「文件哈希‘4ab5d20e55ef73e4f412d73c2a201e’,並在那裏我有比較:

 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"); 
     } 

更新:我也總是得到消息」消息不正確「:

 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"); 
     } 

更新:

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

您顯示的代碼不應該在沒有警告的情況下編譯。你有'CHAR a [] =「...」;'和'CHAR b =「」;'。你不能比較字符串與'=='是否相等,但是你可以。 –

+0

想想你將如何比較兩個數組:逐個元素。只有在相應的元素相等時,兩個數組才相等。你不能只做一個比較,然後馬上知道哈希是一樣的,你必須等到你知道所有的東西都是一樣的。如果你發現一個元素不匹配,那麼你立即知道它們不相同。 – e0k

+0

再次感謝您的回答。對於我所瞭解的你的幫助,我現在更新的代碼應該可以工作,因爲如果它發現兩個字母不同,它將返回false,如果都是icual,它將返回true。但我總是得到消息「哈希是不同的」,他們是icual。 – Jax

回答

2

你有一些顯著問題同類型的,至少在比較

if(hashResult == hashExpected){ 

hashResultCHARhashExpected(沒有數組索引)是在存儲器其中CHAR陣列開始地址。您需要比較存儲在該數組中的實際值,而不僅僅是它所在的地址。

編輯:我注意到hashResultCHAR,而不是像之前編寫的數組。無論哪種方式,hashResult == hashExpected比較是不合適的。

+0

感謝您的回答。據我所知,問題是hashResult存儲沒有數組索引。現在我這樣做,但結果是一樣的,消息說「哈希是不同的」。 – Jax

+0

您仍然比較if語句中的地址,而您必須在遍歷數組的同時比較數組中的值,比如'if(hashResult [i] == hashExpected [i]){'。或者如果字符數組'\ 0'終止,則使用字符串比較函數 –

+0

感謝您試圖提供幫助。我認爲現在應該可以工作,因爲Im遍歷數組並檢查每個元素是否對另一個元素是不合適的。但即使我將hashExpected更改爲另一個,它始終顯示「哈希值是相同的」。 – Jax