[英]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.