43

os.urandom(64) を呼び出すと、64 のランダム バイトが与えられます。Convert bytes to a Python stringを参照して試しました

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 ランダム トークンを生成しています。

4

4 に答える 4

74

以下のコードは、Python 2.7 と 3 の両方で動作します。

from base64 import b64encode
from os import urandom

random_bytes = urandom(64)
token = b64encode(random_bytes).decode('utf-8')
于 2014-02-21T06:51:37.137 に答える
13

ランダムなバイトがあります。それが文字列にデコード可能であったとしたら、私は非常に驚くでしょう。

Unicode 文字列が必要な場合、Latin-1 からデコードします。

a.decode('latin1')

バイトを対応する Unicode コード ポイントに 1 対 1 でマップするためです。

于 2013-07-30T22:11:38.693 に答える
10

base-64 エンコーディングを使用できます。この場合:

a = os.urandom(64)
a.encode('base-64')

また、指定した形式からユニコードに変換しようとしているため、encodeではなく hereを使用していることにも注意してください。したがって、あなたの例では、ランダムバイトを有効な文字列を形成するかのように扱っていますが、ランダムバイトの場合はめったにありません。decodedecodeutf-8

于 2013-07-30T22:11:54.107 に答える