在 Python 中解码 Base-64 数据

Jay Shaw 2023年1月30日 2022年5月17日
  1. 在 Python 中演示解码 Base64 数据
  2. 在 Python 中使用 Base64 解码图像
在 Python 中解码 Base-64 数据

本文旨在解释如何解码 Base64。我们将查看解码 Base64 数据的代码,然后尝试 Base64 图像解码。

在 Python 中演示解码 Base64 数据

Base64 解码是一个五步过程,如下。

  • 取 base64 格式的字符串,转换成对应的十进制形式,按照 base64 解码转换表。
  • 将这些十进制数转换为 6 位二进制。
  • 转换后,这些 6 位二进制需要分离成 8 位二进制表示格式。
  • 这些 8 位二进制数需要再次转换为十进制形式。
  • 最后,这些十进制数字需要转换为相应的 base64 编码字母。

参考下面的例子。

假设我们有一个 Base64 编码的字符串 U3Vubnk=,它必须经过 Base64 解码。第一步需要将其转换为十进制形式。

20 55 21 46 27 39 36=

这些十进制字符需要转换为它们的 6 位二进制形式。

010100, 110111, 010101, 101110, 011011, 100111, 100100, 00

将其分离为 8 位:

01010011, 01110101, 01101110, 01101110, 01111001, 00000000

最后一组附加了 4 个额外的零以使其成为 8 位。它不影响结果。现在,这些 8 位二进制文​​件需要转换为十进制格式。

83 117 110 110 121 0

最后,我们将使用标准转换表将这些十进制数字转换为相应的字母。

S u n n y

在 Python 中手动解码 Base64 数据

这些是在 Python 中手动解码 Base64 的步骤。

  • 导入 Base64 库包。这个库包有助于在 Python 中编码和解码 Base64 数字。
  • 声明一个字符串变量 input_string 并将编码值’U3Vubnk=‘作为输入。
  • 变量 base64_converted_string 采用值 ‘U3Vubnk=’ 并将其转换为 ASCII 值。
  • 在第四步中,我们使用变量 decode 将 ASCII 值转换为它们的 Base64 值。下面的语法将 ASCII 值转换为它们的 Base64 值。

    ``text
    base64.b64decode(base64_converted_string)

  • 最后一步,变量 decimal_converted_string 用于将 Base64 值解码为相应的 ASCII 字符。

    语法:

    variable_name.decode("ascii")
    

在下面的程序中,decode 是存储 Base64 解码值的变量。我们需要打印变量 decimal_converted_string 来查看解码结果。

代码:

import base64

input_string = "U3Vubnk="
base64_converted_string = input_string.encode("ascii")
decode = base64.b64decode(base64_converted_string)
decimal_converted_string = decode.decode("ascii")

print(decimal_converted_string)

输出:

Sunny

在 Python 中使用 UTF-8 解码 Base64 数据

UTF-8 方法是使用 python 解码 Base64 的更直接的方法。让我们看看这是如何工作的。

  • 我们首先需要像上面的程序一样导入 Base64 库包。
  • 变量 input_string 用于存储需要解码的值。
  • 我们使用变量 decoded_value 将输入字符串转换为其对应的二进制数组值。用于解释此字符串的方法是 UTF-8,它与 ASCII 非常相似。
  • 字符串被解释为它的 8 位二进制值。也可以选择其他解释格式。
  • 为了查看结果,我们打印变量 decoded_value

代码:

import base64

input_string = 'U3Vubnk='

decoded_value = base64.b64decode(input_string).decode('utf-8')

print(decoded_value)

输出:

Sunny

在 Python 中使用 Base64 解码图像

最后一节将讨论 Base64 解码的实际用途,例如 Base64 图像编码和解码。我们将研究如何使用 Python 将图像编码到其 Base64 代码中,以及如何将其解码回来。

我们有一个名为 cheers.jpg 的图像,它将被编码。

使用 Base64 编码的图像

在 Python 中使用 Base64 对图像进行编码

导入 Base64 库包。语法 with open("cheers.jpg", "rb") 是一个 Base64 函数,它将图像的字节存储在我们创建的名为 photo2code 的对象中。

图像的 Base64 编码值存储在变量 coded_str 中。语法 photo2code.read() 读取图像的字节值,函数 base64.b64encode(objectname.read() 将字节值转换为 Base64 编码值。

最后,打印 coded_str 以查看 Base64 输出。

代码:

import base64

with open("cheers.jpg", "rb") as photo2code:
    coded_str = base64.b64encode(photo2code.read())
    print(coded_str)

在这里,输出是一个长密文。你可以执行上述代码以在你的机器上生成结果。

在 Python 中将 Base64 代码解码为其图像形式

解码图像文件需要两个主要步骤:

  • 读取 Base64 数据,以及
  • 解码数据并将其写入图像文件。

读取 Base64 数据

创建一个可写的 .bin 文件来存储此步骤的 Base64 值。

语法 with open('file_name, "wb") as file: 创建一个可写的 ("wb") .bin 文件,我们在其中存储 Base64 值。file.write(coded_str) 语法只是将这些 Base64 值写入该 .bin 文件。

这里,变量 coded_str 用于上述程序。上述程序可用于重新创建 coded_str 变量,但也可以使用 .txt 文件。

它所需要的只是将具有 Base64 值的文件放入语法中,with open('(filename.extension)', "wb") as file:,然后该文件将被加载到程序中。应确保该文件与存储 python.txt 文件的目录相同,否则系统不会与之交互。

解码 Base64 值并写入图像文件

在这里,我们将使用 .bin 文件中的值进行解码。创建变量 decoder,通过语法 decoder = open('pic_encoding.bin', 'rb') 加载 .bin 文件。

该文件作为可读实体加载,因为我们将不再在该文件中写入任何内容。然后使用语法 read_b64 = decoder.read() 的变量读取解码器的内容。

变量 final_decoder 用于创建一个新的可写 .jpeg 文件,我们将在其中存储解码后的 Base64 值。

最后,我们将内容解码并写入一个新的图像文件。

让我们回顾一下到目前为止为使一切变得清晰的步骤。

  • 我们在 coded_str 变量中有 Base64 值。
  • 这些值写入 .bin 文件 pic_encoding.bin
  • 然后,数据从 .bin 文件加载到变量 decode。
  • 我们使用变量 read_64 来读取存储在解码器变量中的编码值。
  • 最后,我们创建一个空图像文件 pic_decoded_back.jpeg 和变量 final_decoder,它将充当将解码数据传输到图像文件中的漏斗。

当上述所有步骤启动时,我们解码二进制值并使用语法将这些值写入图像文件,

final_decoder.write(base64.b64decode((read_b64)))

Base64 函数从变量 read_b64 中获取值,并通过变量 final_decoder 将它们传输到图像文件中。

如果执行得当,该程序将在 python.txt 文件所在的同一目录中生成一个新的图像文件。

代码:

import base64

with open('pic_encoding.bin', "wb") as file:
    file.write(coded_str)

## decoding
decoder = open('pic_encoding.bin', 'rb')
read_b64 = decoder.read()

final_decoder = open('pic_decoded_back.jpeg', 'wb')
final_decoder.write(base64.b64decode((read_b64)))