【问题标题】:How do I convert this Python2 code into Python3?如何将此 Python2 代码转换为 Python3?
【发布时间】:2021-07-10 19:51:05
【问题描述】:

我在转换这个 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' 这不是我希望它返回的。

【问题讨论】:

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


    【解决方案1】:

    在 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 上也能正常运行,并产生正确的结果。

    【讨论】:

    • 非常感谢!
    猜你喜欢
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 2020-10-11
    • 1970-01-01
    • 2018-03-09
    • 2022-08-05
    • 1970-01-01
    相关资源
    最近更新 更多