Os.urandom(64)を呼び出すと、64バイトのランダムバイトが与えられます。 バイトをPython文字列)に変換する を参照して
a = os.urandom(64)
a.decode()
a.decode("utf-8")
しかし、バイトがutf-8にないことを示すトレースバックエラーが発生しました。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 0: invalid start byte
バイトで
b'\x8bz\xaf$\xb6\x93q\xef\x94\x99$\x8c\x1eO\xeb\xed\x03O\xc6L%\xe70\xf9\xd8
\xa4\xac\x01\xe1\xb5\x0bM#\x19\xea+\x81\xdc\xcb\xed7O\xec\xf5\\}\x029\x122
\x8b\xbd\xa9\xca\xb2\x88\r+\x88\xf0\xeaE\x9c'
これらのバイトを何らかの文字列表現にデコードする完全な方法はありますか?複数のデータベースエンジン間で関連ドキュメントを追跡するために、Sudoランダムトークンを生成しています。
以下のコードは、Python 2.7と3の両方で動作します:
from base64 import b64encode
from os import urandom
random_bytes = urandom(64)
token = b64encode(random_bytes).decode('utf-8')
Base-64エンコードを使用できます。この場合:
a = os.urandom(64)
a.encode('base-64')
また、encode
は指定された形式からUnicodeに変換しようとしているため、ここではdecode
ではなくdecode
を使用していることに注意してください。したがって、あなたの例では、ランダムバイトを有効なutf-8
文字列を形成するかのように扱っていますが、これはランダムバイトの場合にはめったにありません。
ランダムなバイトがあります。それが文字列に解読可能であったならば、私は非常に驚くでしょう。
haveでUnicode文字列を使用する場合、Latin-1からデコードします。
a.decode('latin1')
バイトを1対1で対応するUnicodeコードポイントにマッピングするためです。