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

在这个python示例之后,我将字符串编码为Base64,其中:


>>> import base64

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

>>> encoded

b'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

为什么是这样?


炎炎设计
浏览 656回答 3
3回答

莫回无

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摘要表。

翻阅古今

如果要编码的数据包含“异国情调”字符,我认为你必须编码为“UTF-8”encoded = base64.b64encode (bytes('data to be encoded', "utf-8"))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python