为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我需要'b'来编码Base64的字符串?

为什么我需要'b'来编码Base64的字符串?

炎炎设计 2019-08-30 14:40:42
在这个python示例之后,我将字符串编码为Base64,其中:>>> import base64>>> encoded = base64.b64encode(b'data to be encoded')>>> encodedb'ZGF0YSB0byBiZSBlbmNvZGVk'但是,如果我省略领先b:>>> encoded = base64.b64encode('data to be encoded')我收到以下错误:Traceback (most recent call last):  File "<stdin>", line 1, in <module>  File "C:\Python32\lib\base64.py", line 56, in b64encode   raise TypeError("expected bytes, not %s" % s.__class__.__name__)   TypeError: expected bytes, not str为什么是这样?
查看完整描述

3 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

base64编码需要8位二进制字节数据和编码它仅使用字符A-Z,a-z,0-9,+,/*所以它可以在不保留任何数据,例如电子邮件的所有8位信道来传输。


因此,它需要一个8位字节的字符串。您可以使用b''语法在Python 3中创建它们。


如果你删除它b,它就变成了一个字符串。字符串是一系列Unicode字符。base64不知道如何处理Unicode数据,它不是8位。事实上,这并不是真的。:-)


在你的第二个例子中:


>>> encoded = base64.b64encode('data to be encoded')

所有字符都巧妙地适合ASCII字符集,因此base64编码实际上有点无意义。您可以将其转换为ascii


>>> encoded = 'data to be encoded'.encode('ascii')

或者更简单:


>>> encoded = b'data to be encoded'

在这种情况下哪个是相同的。


*大多数base64风味最后也可能包括一个=填充。此外,某些base64变体可能使用除+和之外的字符/。有关概述,请参阅Wikipedia上的Variants摘要表。


查看完整回答
反对 回复 2019-08-30
?
翻阅古今

TA贡献1780条经验 获得超5个赞

如果要编码的数据包含“异国情调”字符,我认为你必须编码为“UTF-8”


encoded = base64.b64encode (bytes('data to be encoded', "utf-8"))


查看完整回答
反对 回复 2019-08-30
  • 3 回答
  • 0 关注
  • 653 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信