5

バイト変数を文字列に変換したい。もちろん、私に関連する以前の質問があります。ただし、この方法でファイルのコンテンツを md5() でハッシュしようとすると、次のようになります。

import hashlib
with open("C:\\boot.ini","r") as f:
    r=f.read()
a=hashlib.md5()
a.update(r.encode('utf8'))
bytes_data=a.digest()
print(bytes_data)
r=type(bytes_data)
print(r) # <-- Just to be sure, it is in bytes 
myString=bytes_data.decode(encoding='UTF-8')

このエラーが発生しました:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe3 in position 1: invalid continuation byte

この質問のおかげで問題の理由を理解しましたが、ハッシュを計算するためにさまざまなファイルを扱っているため、バイトを制御できないため、この問題を解決するにはどうすればよいですか?

4

1 に答える 1

8

hash.digest()戻り値はUTF -8 でエンコードされた文字列ではありません。解読しようとしないでください。これは 0 ~ 255 の範囲の一連のバイトであり、これらのバイトはテキストを表していません。

すべてのbytesコンテンツがテキストをエンコードするわけではありません。これはそのような値の 1 つです。

hash.hexdigest()代わりに印刷可能なものが必要な場合に使用します。このメソッドは、代わりに 16 進数で表されたバイトを返します (ダイジェスト バイトごとに 2 つの 16 進文字)。これは、MD5 ダイジェストを他のユーザーと共有する場合に一般的に使用される形式です。

于 2014-07-23T12:57:05.173 に答える