使用Python进行Base64编码和解码

假设您有一个要通过网络传输的二进制映像文件。 您对另一侧未正确接收文件感到惊讶-该文件仅包含奇怪的字符!

好吧,似乎您尝试以原始位和字节格式发送文件,而所使用的媒体是为流文本而设计的。

避免此类问题的解决方法是什么? 答案是Base64编码。 在本文中,我将向您展示如何使用Python编码和解码二进制图像。 该程序被图示为一个独立的本地程序,但是您可以将该概念应用于其他应用程序,例如将编码的图像从移动设备发送到服务器以及许多其他应用程序。

什么是Base64?

在继续深入本文之前,让我们定义一下Base64的含义。

Base64是一种将8位二进制数据编码为可以用7位表示的格式的方法。 为了表示数据,仅使用字符AZaz0-9+/来完成,其中=用于填充数据。 例如,使用此编码,三个8位字节被转换为四个7位字节。

Base64一词取自多用途Internet邮件扩展(MIME)标准,该标准广泛用于HTTP和XML,最初是为对电子邮件附件进行编码而开发的。

为什么我们使用Base64?

Base64对于二进制数据表示非常重要,因此它允许二进制数据以看起来和充当纯文本的方式表示,这使其更可靠地存储在数据库中,通过电子邮件发送或用于基于文本的文本中格式,例如XML。 Base64基本上用于以ASCII字符串格式表示数据。

如本文引言中所述,如果没有Base64,有时根本无法读取数据。

Base64编码

Base64编码是将二进制数据转换为64个字符的有限字符集的过程。 如第一节所示,这些字符是AZaz0-9+/ (算出它们,您发现它们加起来是64吗?)。 该字符集被认为是最常见的字符集,被称为MIME的Base64。 它使用AZaz0-9+ ,和/用于第一62个值,并且+/最后两个值。

Base64编码的数据最终要比原始数据长,因此,如上所述,对于每3个字节的二进制数据,至少有4个字节的Base64编码的数据。 这是由于我们将数据压缩为较小的一组字符。

您是否看过原始电子邮件文件的一部分(如下所示)(很可能源自未发送的电子邮件)? 如果是这样,那么您已经看到了Base64编码的实际应用! (如果您注意到“ =”,则可以得出结论,这是Base64编码,因为在填充的编码过程中使用了等号。)

Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64

2KfZhNiz2YTYp9mFINi52YTZitmD2YUg2YjYsdit2YXYqSDYp9mE2YTZhyDZiNio2LHZg9in2KrZ
h9iMDQoNCtij2YjYryDZgdmC2Lcg2KfZhNin2LPYqtmB2LPYp9ixINi52YYg2KfZhNmF2YLYsdix
2KfYqiDYp9mE2K/Ysdin2LPZitipINin2YTYqtmKINiq2YbYtdit2YjZhiDYqNmH2Kcg2YTZhdmG
INmK2LHZitivINin2YTYqtmI2LPYuSDZgdmKDQrYt9mE2Kgg2KfZhNi52YTZhSDYp9mE2LTYsdi5
2YrYjCDYudmE2YXYpyDYqNij2YbZiiDYutmK2LEg2YXYqtiu2LXYtSDYqNin2YTYudmE2YUg2KfZ
hNi02LHYudmKINmI2KPZgdiq2YLYryDZhNmE2YXZhtmH2Kwg2KfZhNi52YTZhdmKDQrZhNiw2YTZ
gy4NCg0K2KzYstin2YPZhSDYp9mE2YTZhyDYrtmK2LHYpyDYudmE2Ykg2YbYtdit2YPZhSDZgdmK
INmH2LDYpyDYp9mE2LTYo9mGLg0KDQrYudio2K/Yp9mE2LHYrdmF2YYNCg==
--089e0141aa264e929a0514593016
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: base64

Base64分多个步骤执行,如下所示:

  • 要编码的文本将转换为其相应的十进制值,即转换为其ASCII等效值(即a:97,b:98等)。 这是ASCII表 。
  • 在上述步骤中获得的十进制值将转换为它们的二进制等效值(即97:01100001)。
  • 将所有等效的二进制数连接起来,获得大量的二进制数。
  • 大的二进制数集分为相等的部分,每个部分仅包含6位。
  • 相等的6位集将转换为它们的十进制等效项。
  • 最后,将十进制等效项转换为它们的Base64值(即4:E)。 这是十进制值及其Base64字母 。

Base64解码

Base64解码与Base64编码相反。 换句话说,它是通过反转上一部分中描述的步骤来执行的。

因此,Base64解码的步骤可以描述如下:

  • 字符串中的每个字符均更改为其Base64十进制值。
  • 获得的十进制值将转换为它们的二进制等效值。
  • 从获得的每个二进制数中截断二进制数的前两位,然后将6位集合合并,形成一个大的二进制数字字符串。
  • 在上一步中获得的较大的二进制数字字符串被分成8位的组。
  • 8位二进制数将转换为它们的十进制等效项。
  • 最后,将获得的十进制值转换为等效的ASCII。

编码图像

现在让我们来看看本文的内容。 在本节中,我将向您展示如何使用Python轻松实现Base64编码图像。

我将使用以下二进制图像。 继续,下载它,让我们滚动Python! (我假设图像的名称是deer.gif 。)

使用Python进行Base64编码和解码_第1张图片

为了在Python中使用Base64,我们要做的第一件事是导入base64模块 :

import base64

为了对图像进行编码,我们只需要使用base64.encodestring(s)函数。 Python提及以下有关此功能的内容:

对字符串s进行编码,该字符串可以包含任意二进制数据,然后返回一个包含一行或多行base64编码数据的字符串。 encodestring()返回一个字符串,该字符串包含一行或多行以base64编码的数据,该数据始终包括一个额外的尾随换行符('\ n')。

因此,我们可以执行以下操作来对图像进行Base64编码:

import base64 
image = open('deer.gif', 'rb') #open binary file in read mode
image_read = image.read()
image_64_encode = base64.encodestring(image_read)

如果要查看编码过程的输出,请键入以下内容:

print image_64_encode

解码影像

要使用Python解码图像,我们只需使用base64.decodestring(s)函数。 Python提及以下有关此功能的内容:

对字符串s进行解码,该字符串必须包含一行或多行base64编码的数据,然后返回包含结果二进制数据的字符串。

因此,为了解码上一节中编码的图像,我们执行以下操作:

base64.decodestring(image_64_encode)

放在一起

让我们将Base64编码和解码图像的程序放在一起。 执行该操作的Python脚本应类似于以下内容:

import base64
image = open('deer.gif', 'rb')
image_read = image.read()
image_64_encode = base64.encodestring(image_read)
image_64_decode = base64.decodestring(image_64_encode) 
image_result = open('deer_decode.gif', 'wb') # create a writable image and write the decoding result
image_result.write(image_64_decode)

如果打开桌面上的deer_decode.gif ,您会注意到您拥有deer.gif编码的原始图像deer.gif

正如我们从本文中看到的那样,Python使执行似乎复杂的任务变得非常容易。

学习Python

无论您是刚刚起步还是想学习新技能的经验丰富的程序员,都可以通过我们完整的python教程指南学习Python。

翻译自: https://code.tutsplus.com/tutorials/base64-encoding-and-decoding-using-python--cms-25588

你可能感兴趣的:(字符串,python,java,编程语言,linux)