2016-11-07 10 views
0

私のアプリケーションには自動更新機能があります。ファイルを正常にダウンロードしたかどうかを確認するために、2つのハッシュを比較します.1つはxmlに、もう1つはダウンロード後に生成されたハッシュです。 2つのハッシュは同じですが、2つのハッシュが同じではないことを私に投げかけます。私がサイズをチェックすると、xmlハッシュストリングは66、もう一つは36です。私はトリムメソッドを使用しますが、まだ運はありません。文字列が等しくないイベント実際には等しい

 string file = ((string[])e.Argument)[0]; 
     string updateMD5 = "--"+((string[])e.Argument)[1].ToUpper()+"--"; 
     string xx="--"+Hasher.HashFile(file, HashType.MD5).ToUpper()+"--"; 
     // Hash the file and compare to the hash in the update xml 
     int xxx = (updateMD5.Trim()).Length; 
     int xxxxx = xx.Trim().Length; 
     if (String.Equals(updateMD5.Trim(), xx.Trim(), StringComparison.InvariantCultureIgnoreCase)) 
      e.Result = DialogResult.OK; 
     else 
      e.Result = DialogResult.No; 

調理人コード

internal static string HashFile(string filePath, HashType algo) 
    { 
     switch (algo) 
     { 
      case HashType.MD5: 
       return MakeHashString(MD5.Create().ComputeHash(new FileStream(filePath, FileMode.Open))); 
      case HashType.SHA1: 
       return MakeHashString(SHA1.Create().ComputeHash(new FileStream(filePath, FileMode.Open))); 
      case HashType.SHA512: 
       return MakeHashString(SHA512.Create().ComputeHash(new FileStream(filePath, FileMode.Open))); 
      default: 
       return ""; 
     } 
    } 

    private static string MakeHashString(byte[] hash) 
    { 
     StringBuilder s = new StringBuilder(); 

     foreach (byte b in hash) 
      s.Append(b.ToString("x2").ToLower()); 

     return s.ToString(); 
    } 

注:私が使用して - あなたが示した後はスペース enter image description here

StringBuilder s=new StringBuilder(); 
     foreach (char c in updateMD5.Trim()) 
      s.AppendLine(string.Format("{0}=={1}",c,(int)c)); 

enter image description here

+3

テキストとして[mcve]を含めてください。 – Sayse

+2

ここに表示されているものの間にはミスマッチがあります。左側の文字列は明らかに66文字ではありません。あなたが正しいものを見ていることを確認してください。 –

+0

カスタムクラス "Hasher"?あなたの機能も提供してください。 – Prisoner

答えて

1

が後続しているかどうかを確認するために '' をより長い文字列の文字出力の説明ationは明らかです。

については、なぜになるのでしょうか?この問題は、問題の性質上、われわれの側からは言えません。とにかく

、問題は、これらの2つである:

==8204 
==8203 

これら2つのコードポイントが別名0x200Cと0x200Bある:

これらは目に見えない文字で、単語区切りのヒントを与えることを意図していますアルゴリズムと同様のものがあります。

簡単に言えば、文字列を連結するコードのどこかに、その2つの文字がソースコードの一部として含まれています。あなたのソースコードでは見えないので(幅ゼロ、覚えている)、見つけにくいかもしれません。

私はthiseに関係するすべての文字列を見ていますが、特に、ハッシュコードを構築するのに使用される"x2"形式の文字列、または適用する更新プログラムのMD5コードを返すコードから始めることになります。

+0

このコードで使用する正しいコードは何ですか? 'updateMD5 = updateMD5.Replace(" \ 0 "、" ");' Matthew Watsonの答えに基づいています。 – Vic

+0

私はすでにこのコード 'string updateMD5 =((string [])e.Argument)[1] .ToUpper()。Replace(" \ u200B "、" ")を使用して、ゼロ点とゼロ幅スペースでゼロを取り除いています。 ).Replace( "\ u200C"、 ""); ' – Vic

関連する問題