小能豆

为什么需要“b”来使用 Base64 编码字符串?

py

我遵循了文档中有关如何在 Python 中使用 Base64 编码的示例:

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

但是,如果我尝试对普通字符串进行编码-省略前导b

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

我得到了一个TypeError。在旧版本的 Python 中它看起来像:

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

在较新的版本中它可能看起来像:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.12/base64.py", line 58, in b64encode
    encoded = binascii.b2a_base64(s, newline=False)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: a bytes-like object is required, not 'str'

为什么会发生这种情况?


阅读 20

收藏
2024-09-21

共1个答案

小能豆

您遇到的错误是由于 Python 3 中处理字符串和字节的方式发生了变化。

解释:

在 Python 2 中,字符串 ( str) 和字节字符串 (unicodestr) 在某种程度上是可以互换的,这可能会引起混淆。然而,在 Python 3 中,两者有了明显的区别:

  • str:代表文本(Unicode)。
  • bytes:表示二进制数据(字节序列)。

错误发生的原因:

当您调用 时base64.b64encode(),它需要一个字节类对象作为参数。如果您传递一个普通字符串(str在 Python 3 中为 ),它会引发 ,TypeError因为该函数无法直接处理字符串——它需要数据为字节格式。

如何修复:

要在 Python 3 中编码普通字符串,首先应将其转换为字节。您可以使用该encode()方法执行此操作:

import base64

# Correctly encoding a normal string
encoded = base64.b64encode('data to be encoded'.encode('utf-8'))
print(encoded)

概括:

  • 当使用需要字节类对象的函数时,请始终将字符串编码为字节,例如base64.b64encode()
  • 使用encode('utf-8')或任何其他编码strbytes

这一变化确保更好地处理文本和 b

2024-09-21