Проблема шестнадцатеричного представления

Если я хочу следующий результат:

RIPEMD-160("The quick brown fox jumps over the lazy dog") =
 37f332f68db77bd9d7edd4969571ad671cf9dd3b

Я попробовал это:

string hash11 = System.Text.Encoding.ASCII.GetString(RIPEMD.ComputeHash(Encoding.ASCII.GetBytes("The quick brown fox jumps over the lazy dog")));

но это не дает мне предыдущий результат!

2 ответа

Решение

Функция ComputeHash предоставляет вам байтовый массив со значениями в нем (0x37, 0xF3, ...). Если вы используете GetString, он будет принимать каждое значение в байте и использовать символ с этим значением, он не будет преобразовывать значение в строку.

Вы можете преобразовать это так:

var bytes = RIPEMD.ComputeHash(Encoding.ASCII.GetBytes("The quick brown fox jumps over the lazy dog"));
string hash11 = "";
foreach(var curByte in bytes)
    hash11 = curByte.ToString("X2") + hash11; // or curByte.ToString("X") if for example 9 should not get 09

Например, у вас есть старший байт в начале. С

hash11 += curByte.ToString("X2")

у вас есть младший байт в начале.

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

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

Другие вопросы по тегам