在这python example之后,我用以下命令将一个字符串编码为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

这是为什么?

推荐答案

base64编码采用8位二进制字节数据并进行编码,它只使用字符A-Za-z0-9+/*,因此可以通过不保留所有8位数据的通道进行传输,例如邮箱.

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

如果go 掉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变体可能使用+/以外的字符.请参阅维基百科上的Variants summary table页以了解概述.

Python相关问答推荐

使用pandas MultiIndex进行不连续 Select

收件箱转换错误- polars.exceptions. ComputeHelp- pandera(0.19.0b3)带有polars

创建带有二维码的Flask应用程序,可重定向到特定端点

symy.分段使用numpy数组

如何销毁框架并使其在tkinter中看起来像以前的样子?

使用mySQL的SQlalchemy过滤重叠时间段

替换字符串中的多个重叠子字符串

运行总计基于多列pandas的分组和总和

pandas滚动和窗口中有效观察的最大数量

将pandas Dataframe转换为3D numpy矩阵

在Mac上安装ipython

如何在WSL2中更新Python到最新版本(3.12.2)?

字符串合并语法在哪里记录

使用Python从URL下载Excel文件

如何更新pandas DataFrame上列标题的de值?

如何禁用FastAPI应用程序的Swagger UI autodoc中的application/json?

Tkinter菜单自发添加额外项目

Python全局变量递归得到不同的结果

寻找Regex模式返回与我当前函数类似的结果

matplotlib图中的复杂箭头形状