Python 如何使用 base64 解码文本

How to decode text with base64 in Python

我试图制作一个文本解码器,但它会对文本进行编码。我尝试了许多其他方法,但它会说要解码的文本是字符串而不是字节。 代码:

def encode():
    askencode = input("Type something to encode:")
    askencode = askencode.encode("utf-8")
    base64_info_encode = base64.b64encode(askencode)
    print("This is your encoded text:", base64_info_encode)
    print(base64_info_encode.decode("utf-8"))



def decode():
    askdecode = input("Type something to decode:")
    askdecode = askdecode.encode()
    print(askdecode.decode("utf-8"))
    base64_info_decode = base64.decodebytes(askdecode)
    print("This is your decoded text:", base64_info_decode)

输出:

This is your decoded text: b'm!\x95\xb1\xb1\xbc'

编码消息:你好

之所以说它需要一个字符串而不是字节是因为 base64.decodebytes(askdecode),即 - decodebytes 需要字节,而你传递的是一个字符串。

您可以尝试此处提供的其他一些解码方法:https://docs.python.org/3/library/base64.html

这让许多新程序员(Python 或其他)感到困惑。

在Python中,记忆的方式是这样的:一个字符串(str)没有编码,它只是一串字符,就像理想的柏拉图式字符表示。字符串 'A' 不包含 ASCII 字符或 UTF-8 字符,它只包含字母 A.

然而,bytes只是一组字节,可以解释为对一些字符进行编码。 IE。 b'A' 是一个 bytes,其中包含 UTF-8 编码的字符 'A',因为这是 Python 的默认编码(除非您当然更改了默认值)。

str.encode() 方法获取该字符串中的字符并将它们编码为给定特定编码的字节序列(默认使用 utf-8)。

bytes.decode() 方法获取 bytes 中的分组字节并将它们解码为给定特定编码的字符串(默认使用 utf-8) .

这就是 'ä'.encode('ascii') 会失败的原因,因为在 ASCII 字符集中没有对 'ä' 的编码,但是 'ä'.encode('utf-8') 工作得很好,因为有对 'ä' 的编码UTF-8 字符集。事实上,您很难想出一个不是 UTF 格式但仍可以在现代计算机上表示为字符的字符。

Python 试图在打印变量时保持清晰。如果您 print('A'),Python 会将实际字符 'A' 写入输出。但是如果你 print(b'A'),它会打印 b'A',因为它不只是选择解码将字节转换为文本。您必须告诉它 print(b'A'.decode()) 才能获得与直接打印字符串相同的结果。

还有一点要记住:由于字符串只是一系列理想的字符,您可以尝试将其编码为包含这些字符的任何编码。但是,如果这些字节在该编码中确实有意义,则您只能解码一系列字节并获得您期望的结果。这就是为什么,如果您想将 bytes 中的字符从一种编码更改为另一种编码,您通常需要解码然后使用新编码重新编码;由您决定/记住 bytes 的编码方式,它不会作为 bytes 序列本身的一部分保存。

例如:

>>> x = 'ä'.encode('cp1252')
>>> x
b'\xe4'
>>> x.decode('cp1252').encode('euc_jp')
b'\x8f\xab\xa3'

关于你的问题:

    askdecode = askdecode.encode()
    print(askdecode.decode("utf-8"))
    base64_info_decode = base64.decodebytes(askdecode)

此处您将 ​​askdecode.encode() 的结果分配给 askdecode,因此您现在应该看到这使得 askdecode 成为 bytes

第二行有效,因为它被解码为字符串(使用相同的编码,因为 "utf-8" 是默认值)。

但是第三行可能会失败,因为 base64.decodebytes 需要一个 base64 编码的字节序列,但是你给了它一个 utf-8 编码的字节序列,而不是每个 utf-8 编码的字节序列也是一组有效的 base64 编码字符。