2016-12-02 3 views
-2

ファイルからハッシュキーを生成し、ハッシュを表示するプログラムがあります。結果ハッシュキーが予想されるハッシュキーに対応するかどうかを確認しようとしています。しかし、これはうまくいきません。なぜなら、ハッシュキーが期待どおりのときには、「ハッシュは違う」というメッセージが出るからです。あなたは正しいものが見えませんか?Progrmaはハッシュが異なると言っていますが、そうではありません

質問に関連するいくつかの変数。誤ったことが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"); 
     } 

アップデートまた、私は常にメッセージを取得し、私は比較を持っているところ」のようなメッセージを示しており、以下のコードで

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

です「:

 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

2つの配列を比較する方法を考えてみましょう。 2つの配列は、対応する要素が等しい場合にのみ値が等しい。あなたはただ一つの比較を行い、それから即座に ''ハッシュが同じである ''ことを知ることはできません。あなたは_all_が同じであることを知るまで待たなければなりません。 1つの要素が一致しないことが分かった場合は、それらが同じではないことをすぐに知ることができます。 – e0k

+0

もう一度お返事ありがとうございます。私があなたの助けによって理解したことは、私が今更新したコードがうまくいくはずです。なぜなら、2つの文字が異なる場合はfalseを返し、すべてがicualならtrueを返すからです。しかし、私はいつもメッセージ "ハッシュは違う"を得ていて、彼らはicualです。 – Jax

答えて

2

あなたはタイプのいくつかの重要な問題を抱えている、少なくとも比較して

if(hashResult == hashExpected){ 

hashResultは(なし配列インデックス付き)CHARhashExpectedあるCHARの配列が始まるメモリ内のアドレスです。その配列に格納されている実際の値を比較する必要があります。

編集:私は気づいたhashResultは、CHARであり、前に書いたように配列ではないことに気づいた。いずれにしても、hashResult == hashExpectedの比較は不適切です。

+0

あなたの答えをありがとう。問題は、hashResultが配列インデックスなしで格納していたことです。今はそれをやっていますが、結果は同じです、 "ハッシュは違います"というメッセージ。 – Jax

+0

配列内の値を比較する必要がある間に、if文のアドレスを比較しながら、配列を反復処理しながら 'if(hashResult [i] == hashExpected [i]){'と比較する必要があります。または、文字配列が '\ 0 'で終了している場合は、文字列比較関数を使用してください。 –

+0

お手伝いをしてくれてありがとう。 Imは配列を繰り返し、各要素が別の要素に似ているかどうかをチェックするので、今はうまくいくはずだと思います。しかし、hashExpectedを別のものに変更しても、常に "ハッシュは同じです"と表示されます。 – Jax

関連する問題