Какую эквивалентную кодировку c # использует Python hash.digest ()? - PullRequest
2 голосов
/ 04 июня 2010

Я пытаюсь перенести программу на Python на c #. Вот строка, которая должна быть прохождением, но в настоящее время мучает меня:

hash = hashlib.md5(inputstring).digest()

После генерации аналогичного хеша MD5 в c # Крайне важно, чтобы я создал строку хеша, аналогичную исходной программе на python, иначе все мое приложение завершится ошибкой.

Моя путаница заключается в том, какую кодировку использовать при преобразовании в строку в c # i.e

?Encoding enc = new ?Encoding();
string Hash =enc.GetString(HashBytes); //HashBytes is my generated hash

Поскольку я не могу создать два похожих хэша при использовании Encoding.Default i.e

string Hash = Encoding.Default.GetString(HashBytes);

Так что я думаю, зная, что кодирование по умолчанию для python hash.digest () поможет

EDIT

Ладно, может быть, еще немного кода сформулирует мою проблему больше. После вычисления хеша в программе python выполняются некоторые вычисления, т.е.

hash = hashlib.md5(inputstring).digest()

for i in range(0,6):

value += ord(hash[i])

return value

Теперь вы видите, почему две разные строки Hash будут проблематичными? Некоторые символы, которые появляются при запуске программы на Python, помечаются знаком '?' в C #.

Ответы [ 3 ]

5 голосов
/ 04 июня 2010

Я предполагаю, что вы используете более раннюю версию Python, чем 3, и ваша строка является нормальной str.

Если вы говорите о выводе, метод дайджеста возвращает строку, состоящую изсырые байты.Эквивалентный тип в C # - byte[], который у вас уже есть.Это не текст, поэтому использование класса Encoding не имеет смысла.

Если вы говорите о вводе, функция md5 принимает обычный str, который представляет собой строку байтов.Вам нужно будет посмотреть код перед этим, чтобы выяснить, в какой кодировке находятся данные.

Редактировать:

Что касается кода, который вы разместили, все, что он делаетэто берет значения шести первых байтов в хэше и складывает их вместе.Вы должны быть в состоянии понять, как сделать это в C #.

И убедиться, что вы изучаете разницу между строкой байтов и строкой символов .

2 голосов
/ 04 июня 2010

Он вообще не кодируется, это просто массив байтов на обоих языках.

0 голосов
/ 04 июня 2010

Согласно документации , строки Python по умолчанию являются ASCII. Альтернативные кодировки должны быть явно указаны . Следовательно, вы должны иметь возможность передавать строку ASCII в библиотеку C # MD5 и получать те же байты хеша, как если бы вы передавали строку в библиотеку Python MD5.

...