2016-11-07 3 views
0

Мое приложение имеет функцию автоматического обновления. Чтобы проверить, успешно ли он загрузил файл, я сравниваю два хэша, один с xml и хэш, сгенерированный после загрузки. Два хэша одинаковы, но он бросает меня, что два хэша не одинаковы. Когда я проверяю размер, хэш-строка 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

Пользовательский класс «Хашер»? Предоставьте также свою функцию. – Prisoner

ответ

1

После того, как вы показали символ для вывода символа более длинной строки объяснение ясно.

Что касается , то почему это случается, это довольно сложно сказать с нашего конца из-за характера проблемы.

Во всяком случае, проблема эти два:

==8204 
==8203 

Эти две точки Кодовые 0x200C и 0x200B ака:

Это невидимые персонажи, предназначенные для того, чтобы давать подсказки для разрыва слова алгоритмов и подобных материалов.

Проще говоря, где-то в вашем коде, где вы объединяете строки, у вас есть эти два символа как часть исходного кода. Так как они не видны в вашем исходном коде (нулевая ширина, помните), их трудно обнаружить.

Я бы посмотрел на все строки, участвующие в этом, в частности я бы начал с строки формата "x2", используемой для создания хеш-кода или, возможно, кода, который возвращает код MD5 для обновления.

+0

Что такое правильный код для использования в этом коде 'updateMD5 = updateMD5.Replace (" \ 0 "," ");' на основе ответа Мэтью Уотсона. – Vic

+0

Я уже избавил ZERO WITH NON-JOINER и ZERO WIDTH SPACE с помощью этого кода 'string updateMD5 = (((string []) e.Argument) [1] .ToUpper(). Заменить (" \ u200B "," ")) .Надеть ("\ u200C", ""); ' – Vic

Смежные вопросы