2

Python プログラムを c# に移植しようとしています。これは、ウォークスルーであるはずの行ですが、現在私を苦しめています:

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

C# で同様の MD5 ハッシュを生成した後、元の python プログラムと同様のハッシュ文字列を作成することが絶対に重要です。そうしないと、アプリケーション全体が失敗します。

私の混乱は、C#で文字列に変換するときに使用するエンコーディングにあります。

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

Encoding.Default を使用すると、2 つの同様のハッシュを作成できないためです。

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

だから私はPythonのデフォルトの hash.digest() エンコーディングを知っていると役立つと思っています

編集

たぶん、もう少しコードが私の問題をより明確にするでしょう。Python プログラムでハッシュが計算された後、いくつかの計算が実行されます。

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

for i in range(0,6):

value += ord(hash[i])

return value

2 つの異なるハッシュ文字列が問題になる理由がわかりましたか? Python プログラムの実行時に表示される文字の一部は、'?' に置き換えられます。C#で。

4

3 に答える 3

5

Python 3 より前のバージョンを使用していて、文字列が通常のstr.

出力について話している場合、ダイジェスト メソッドは raw bytes で構成される文字列を返します。C# での同等の型はbyte[]であり、既にお持ちのようです。これはテキストではないため、Encoding クラスを使用しても意味がありません。

入力について話している場合、関数はバイト文字列でmd5ある通常の を受け取ります。strその前にコードを見て、データがどのエンコーディングに入っているかを把握する必要があります。

編集:

あなたが投稿したコードに関しては、ハッシュの最初の6バイトの値を取得してそれらを加算するだけです。C# でそれを行う方法を理解できるはずです。

また、バイト列と文字列の違いを必ず理解してください。

于 2010-06-03T20:32:43.830 に答える
2

これはまったくエンコードされておらず、どちらの言語でも単なるバイトの配列です。

于 2010-06-03T20:27:36.773 に答える
0

ドキュメントによると、Python 文字列はデフォルトで ASCII です。代替エンコーディングを明示的に指定する必要があります。したがって、ASCII 文字列を C# MD5 ライブラリに渡し、その文字列を Python MD5 ライブラリに渡した場合と同じハッシュ バイトを取得できるはずです。

于 2010-06-03T20:38:46.100 に答える