繁体   English   中英

如何在 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只是一组字节,可以解释为对某些字符进行编码。 b'A'是一个bytes ,其中包含 UTF-8 编码中的字符 'A',因为这是 Python 的默认编码(当然除非您更改了默认值)。

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

所述.decode()一个的方法bytes取入分组的字节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具有什么编码,它不会保存为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 编码序列人物。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM