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

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

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

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

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

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

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

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

ИЗМЕНИТЬ

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

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

for i in range(0,6):

value += ord(hash[i])

return value

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

2
The_AlienCoder 4 Июн 2010 в 00:23

3 ответа

Лучший ответ

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

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

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

Изменить:

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

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

5
Matti Virkkunen 3 Июн 2010 в 21:14

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

2
President James Moveon Polk 3 Июн 2010 в 20:27

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

0
James Sumners 3 Июн 2010 в 20:38