kuharan Ответов: 2

Я пытаюсь получить MD5-хэш файлов в моей системе и его возвращающие недопустимые символы.


Я пытаюсь вычислить хэш MD5 для файлов в моей системе.

 String md5 = CreateMD5(file); //file is the String containing the filename.
labelNew.Text = md5;

public static String CreateMD5(string filename)
{
 using (var md5 = MD5.Create())
 {
  using (var stream = File.OpenRead(filename))
  {
   return BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "‌​").ToLower();
  }
 }
}


Выход есть
d8??eb??f6??e3??b5??1c??33??d5??2d??bd??3d??3a??47??3f??2b??3c
Вместо
d8ebf6e3b51c33d52dbd3d3a473f2b3c


Что я уже пробовал:

Странно, что персонажи появляются в консоли.WriteLine() только и не в форме windows.

Console.WriteLine("New {0}\nOld {1}",labelNew.Text.Replace("?",""), labelExist.Text);

2 Ответов

Рейтинг:
16

Bryian Tan

Странно, что персонажи появляются в консоли.WriteLine() только и не в форме windows.

Действительно странно, мне тоже было любопытно, я немного погуглил и наткнулся на этот пост, описал тот же сценарий и обвинил его в "несоответствии кодировки".

c# - знак вопроса ( " ?") добавляется к строке - переполнение стека[^]
Поток предлагает использовать регулярное выражение для удаления символов, отличных от ASCII
Console.WriteLine("New {0}\nOld {1}", Regex.Replace(labelNew.Text, @"[^\u0000-\u007F]", string.Empty), labelExist.Text);

На самом деле, я не думаю, что это проблема, не так ли? Потому что код выводит результат в метку " labelNew.Text = md5;"?


kuharan

Метка просто не отображает символы, но на самом деле присутствует. Поэтому всякий раз, когда я пытаюсь сопоставить старый md5 с вновь созданным md5, он показывает неправильные результаты. В любом случае я просто решил ее с помощью регулярного выражения.

Рейтинг:
1

OriginalGriff

Это работает для меня:

private void button1_Click(object sender, EventArgs e)
    {
    string s = CreateMD5(@"D:\CP data.txt");
    }
public static String CreateMD5(string filename)
    {
    using (var md5 = MD5.Create())
        {
        using (var stream = File.OpenRead(filename))
            {
            return BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "‌​").ToLower();
            }
        }
    }
Глядя на s в отладчике дает мне:
s   "6d‌​f2‌​50‌​15‌​ce‌​ff‌​e1‌​59‌​6e‌​14‌​84‌​c0‌​34‌​f6‌​62‌​39"    string
Чего я и ожидал.
Так что я делаю то, что отличается от вас?