如何将此 Python2 代码转换为 Python3?

时间:2021-04-15 18:30:55

标签: python python-3.x md5 python-2.x

我在转换此 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' 这不是我想要它返回的。

1 个答案:

答案 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 上运行时也保持不变,并产生正确的结果。