无法在 b64 中编码:需要类似字节的对象而不是 'str'
Unable to encode in b64 : bytes-like object is required not 'str'
我正在尝试将字典转换为特殊查询字符串。
代码适用于 python2 但不适用于 3
例如这个输入:
{'retry': '0', 'locator': 'gamespy.com', 'datetime': '20201114223555'}
我想要得到这个输出:
retry=MA**&locator=Z2FtZXNweS5jb20*&datetime=MjAyMDExMTQyMjM1NTU\r\n
我的 dict_to_qs :
def dict_to_qs(d):
ret = {k: base64.b64encode(v).replace("=", "*") for k, v in d.items()}
return "&".join("{!s}={!s}".format(k, v) for k, v in ret.items()) + "\r\n"
但我有这个错误:
File "/var/www/server/other/utils.py", line 443, in dict_to_qs
ret = {k: base64.b64encode(v).replace("=", "*") for k, v in d.items()}
File "/var/www/server/other/utils.py", line 443, in <dictcomp>
ret = {k: base64.b64encode(v).replace("=", "*") for k, v in d.items()}
File "/usr/lib/python3.7/base64.py", line 58, in b64encode
encoded = binascii.b2a_base64(s, newline=False)
TypeError: a bytes-like object is required, not 'str'
问题是 b64encode
requires a bytes-like object and replace
must be called on a string. 因此必须显式转换。您可以使用 str.encode()
和 str.decode()
方法。
下面的代码在语义上应该等同于您的 Python 2 示例。
def dict_to_qs(d):
ret = {k: base64.b64encode(str.encode(v)).decode().replace("=", "*") for k, v in d.items()}
return "&".join("{!s}={!s}".format(k, v) for k, v in ret.items()) + "\r\n"
输出:retry=MA**&locator=Z2FtZXNweS5jb20*&datetime=MjAyMDExMTQyMjM1NTU*\r\n
我正在尝试将字典转换为特殊查询字符串。
代码适用于 python2 但不适用于 3
例如这个输入:
{'retry': '0', 'locator': 'gamespy.com', 'datetime': '20201114223555'}
我想要得到这个输出:
retry=MA**&locator=Z2FtZXNweS5jb20*&datetime=MjAyMDExMTQyMjM1NTU\r\n
我的 dict_to_qs :
def dict_to_qs(d):
ret = {k: base64.b64encode(v).replace("=", "*") for k, v in d.items()}
return "&".join("{!s}={!s}".format(k, v) for k, v in ret.items()) + "\r\n"
但我有这个错误:
File "/var/www/server/other/utils.py", line 443, in dict_to_qs
ret = {k: base64.b64encode(v).replace("=", "*") for k, v in d.items()}
File "/var/www/server/other/utils.py", line 443, in <dictcomp>
ret = {k: base64.b64encode(v).replace("=", "*") for k, v in d.items()}
File "/usr/lib/python3.7/base64.py", line 58, in b64encode
encoded = binascii.b2a_base64(s, newline=False)
TypeError: a bytes-like object is required, not 'str'
问题是 b64encode
requires a bytes-like object and replace
must be called on a string. str.encode()
和 str.decode()
方法。
下面的代码在语义上应该等同于您的 Python 2 示例。
def dict_to_qs(d):
ret = {k: base64.b64encode(str.encode(v)).decode().replace("=", "*") for k, v in d.items()}
return "&".join("{!s}={!s}".format(k, v) for k, v in ret.items()) + "\r\n"
输出:retry=MA**&locator=Z2FtZXNweS5jb20*&datetime=MjAyMDExMTQyMjM1NTU*\r\n