我有一些在python 2中运行的py2代码:
import uuid
import hashlib
playername = "OfflinePlayer:%s" % name # name is just a text only username
m = hashlib.md5()
m.update(playername)
d = bytearray(m.digest())
d[6] &= 0x0f
d[6] |= 0x30
d[8] &= 0x3f
d[8] |= 0x80
print(uuid.UUID(bytes=str(d)))
然而,当代码在python3中运行时,它产生" TypeError:必须在散列之前对Unicode对象进行编码"当m.update()尝试时。我尝试使用默认的utf-8首先对其进行结束编码:
m.update(playername.encode())
但现在这一行 -
print(uuid.UUID(bytes=str(d)))
产生此错误:
File "/usr/lib/python3.5/uuid.py", line 149, in __init__
raise ValueError('bytes is not a 16-char string')
ValueError: bytes is not a 16-char string
然后我尝试将其解码回来,但按位操作显然毁了它(我在猜猜?):
print(uuid.UUID(bytes=(d.decode())))
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfd in position 2: invalid start byte
我真的不知道按位操作的目的是什么?"大图片"。一般来说,代码片段应该根据用户名的拼写每次生成相同的预期UUID。
我只是想让这段代码在Python3中完成与Python 2相同的工作:(
提前致谢。
答案 0 :(得分:1)
有几件事:
m.update(playername.encode('utf-8'))
应该正确编码你的字符串。
print(uuid.UUID(bytes=bytes(d)))
应该正确返回UUID。
示例:强>