使用 Python2 与 Python3 进行 Base64 URL 解码

Base64 URL decode using Python2 vs Python3

我正在尝试对十六进制字符串进行 base64 url 解码。但是,我无法使用 Python3.

正确解码字符串

十六进制字符串为 614756736247395862334a735a41,对应的 ASCII 为“aGVsbG9Xb3JsZA”。解码后的字符串应该是helloWorld.

我的密码是

str_encoded = "614756736247395862334a735a41"
byte_encoded = binascii.unhexlify(str_encoded)
print(base64.urlsafe_b64decode(str(byte_encoded) + '=' * (4 - len(str(byte_encoded)))))
print(base64.urlsafe_b64decode("aGVsbG9Xb3JsZA=="))

如果我运行上面的Python2,我得到正确的解码字符串helloWorld。但是如果我 运行 和 Python3,第一个 print 给出了错误的结果。

为什么会有差异,我应该在 Python3 中使用什么替代 binascii.unhexlify()

区别在于unhexlify()在python2returns一个str对象,而python3的-bytes,因为python2没有这样的class。 当您 运行 str() 在 Python 3 中的字节对象上运行时,您只会得到该对象的 repr(),因此 str(byte_encoded) in Python 3 returns b"........",如果你想让它在两个版本中都是 运行 我建议你把 str(byte_encoded) 变成 byte_encoded 并解码 byte_encoded 变量,如果它是 Python3,所以它会是这样的:

str_encoded = "614756736247395862334a735a41"
byte_encoded = binascii.unhexlify(str_encoded)
try:
    byte_encoded = byte_encoded.decode()
except:
    pass
print(base64.urlsafe_b64decode(byte_encoded + '=' * (4 - len(str(byte_encoded)))))
print(base64.urlsafe_b64decode("aGVsbG9Xb3JsZA=="))