我在转换此 Python 2 代码时遇到了一些问题:
import md5
steamid=76561197960435530
temp = ""
for i in range(8):
temp += chr((steamid & 0xFF))
steamid >>= 8
m = md5.new("BE"+temp)
print m.hexdigest()
进入Python 3,上面代码的结果是'a071c58205ec529c5c19fa7dadcaae93'。但是,当我尝试使用 hashlib 库在 Python 3 中重现相同的代码时,我得到了完全不同的回报。我希望它返回与 Python 2 代码完全相同的内容。 这是我在 Python 3 中重现代码的尝试:
from hashlib import md5
steamid = 76561197960435530
temp = ""
for i in range(8):
temp += chr((steamid & 0xFF))
steamid >>= 8
m = md5()
m.update(("BE"+temp).encode())
print(m.hexdigest())
返回 'a96d4d4b56a3b5c1a747e01dd7045c6d' 这不是我想要它返回的。
答案 0 :(得分:4)
在 Python 3 中,您使用正确的代码点构建一个字符串,然后使用 encode()
将其转换为字节。这就是问题所在:encode()
将对字符串中的代码点进行 UTF8 编码,这将导致与预期的字节序列不同。为了避免这个问题,你应该从头开始使用字节:
from hashlib import md5
steamid = 76561197960435530
temp = bytearray()
for i in range(8):
temp.append(steamid & 0xFF)
steamid >>= 8
m = md5()
m.update((b"BE" + temp))
print(m.hexdigest())
作为一个额外的好处,这个版本的代码在 Python 2.7 上运行时也保持不变,并产生正确的结果。