ホームページ  >  記事  >  バックエンド開発  >  Python を使用した Base64 エンコードとデコード

Python を使用した Base64 エンコードとデコード

WBOY
WBOYオリジナル
2023-09-02 13:49:051164ブラウズ

ネットワーク経由で転送したいバイナリ イメージ ファイルがあるとします。相手がファイルを正しく受信できなかったことに驚きました。ファイルには奇妙な文字が含まれているだけです。

うーん、使用しているメディアがテキストのストリーミング用に設計されているのに、生のビットおよびバイト形式でファイルを送信しようとしているようです。

そのような問題を回避するための解決策は何ですか?答えはBase64エンコーディングです。この記事では、Python を使用してバイナリ画像をエンコードおよびデコードする方法を説明します。このプログラムはスタンドアロンのローカル プログラムとして説明されていますが、この概念は、エンコードされた画像をモバイル デバイスからサーバーや他の多くのアプリケーションに送信するなど、さまざまなアプリケーションに適用できます。

Base64とは何ですか?

この記事に入る前に、まず Base64 が何を意味するかを定義しましょう。

Base64 は、8 ビットのバイナリ データを 6 ビットで表現できる形式にエンコードする方法です。データを表すには、文字 A-Za-z0-9 / のみが使用されます。 = はデータを入力するために使用されます。たとえば、このエンコードを使用すると、3 つの 8 ビット バイトが 4 つの 6 ビット グループに変換されます。

Base64 という用語は、HTTP および XML で広く使用されている MultiPurpose Internet Mail Extensions (MIME) 標準から取られており、元々は送信用に電子メールの添付ファイルをエンコードするために開発されました。

Base64 を使用するのはなぜですか?

Base64 はバイナリ データ表現にとって重要です。そのため、バイナリ データをプレーン テキストのように見え、動作する方法で表現できるため、データベースへの保存、電子メールでの送信、その他のアプリケーションでの使用の信頼性が高まります。アプリケーション。 XML などのテキストベースの形式。 Base64 は主に、データを ASCII 文字列形式で表すために使用されます。

この記事の冒頭で述べたように、Base64 がないと、データがまったく読み取れないことがあります。

Base64エンコーディング

Base64 エンコードは、バイナリ データを 64 文字の制限されたセットに変換するプロセスです。最初のセクションで示したように、これらの文字は A-Za-z0-9 、および /## です。 # (数えてみると、合計が 64 になることに気づきましたか?)。この文字セットは最も一般的であると考えられており、MIME の Base64 として知られています。最初の 62 個の値には A-Za-z0-9 が使用され、値には / が使用されます。最後の 2 つの値。

Base64 エンコードされたデータは、最終的に元のデータよりも長くなるため、前述したように、バイナリ データの 3 バイトごとに、少なくとも 4 バイトの Base64 エンコード データが存在します。これは、データをより小さい文字セットに圧縮するためです。

以下に示す元の電子メール ファイルの一部 (おそらく未送信の電子メールから派生したもの) を見たことはありますか?そうであれば、Base64 エンコーディングが実際に動作しているのを見たことになります。 (最後に

= がある場合は、エンコード中のパディングに等号が使用されるため、これが Base64 エンコードであることがわかります。) リーリー

Base64 は次のように複数の手順で実行されます:

    エンコードされるテキストは、それぞれの 10 進数値、つまり対応する ASCII 値 (a:97、b:98 など) に変換されます。これは ASCII テーブルです。
  • 上記の手順で取得した 10 進値を、同等の 2 進値 (つまり、97: 01100001) に変換します。
  • すべての等価な 2 進数を連結して、多数の 2 進数のセットを取得します。
  • 等しい部分に分割された 2 進数の大きなセット。各部分には 6 ビットのみが含まれます。
  • 等しい 6 ビット グループは、同等の 10 進数に変換されます。
  • 最後に、等価な 10 進数が Base64 値 (つまり 4: E) に変換されます。以下は、10 進数値とその Base64 アルファベットです。
Base64デコード

Base64 デコードは、Base64 エンコードの逆です。つまり、前のセクションで説明した手順を逆に行うことで実行されます。

したがって、Base64 デコードの手順は次のように説明できます:

    文字列内の各文字は、Base64 10 進数値に変更されます。
  • 取得した 10 進値は、同等の 2 進値に変換されます。
  • 取得した各 2 進数から 2 進数の最初の 2 桁を切り捨て、6 ビットのセットを組み合わせて 2 進数の大きな文字列を形成します。
  • 前のステップで取得した 2 進数の大きな文字列を 8 桁のグループに分割します。
  • 8 桁の 2 進数は、同等の 10 進数に変換されます。
  • 最後に、取得した 10 進数値を対応する ASCII 値に変換します。
Base64 文字列のエンコードとデコード

舞台裏で何が起こっているかを理解すると、すべてがどのように機能するかを理解するのが簡単になります。単純な 3 文字の単語

Hey をエンコードおよびデコードしてみましょう。

まず単語の各文字を対応する ASCII 文字に変換し、次に対応する ASCII をバイナリに変換します。これにより、次の値が得られます:

ASCII 索引值 8 位二进制值
H 72 01001000
e 101 01100101
y 121 01111001

换句话说,我们可以像这样以二进制形式编写 Hey

01001000 01100101 01111001

总共 24 位,当转换为 6 位组时,每个位产生四个值:

010010 000110 010101 111001

在 Base64 表中,字符 AZ 由值 025 表示。字符 az 由值 2651 表示。数字 09 由值 5261 表示。字符 +/6263 表示。字符 = 用于在无法将位正确分为 6 组时进行填充。

我们现在将重新排列的位转换为数值,然后获取代表这些数值的字符。

6 位二进制值 Base64 索引值
010010 18
000110 6 G
010101 21 V
111001 57 5

根据我们上面的计算,字母 Hey 在 Base64 编码时将变成 SGV5。我们可以使用以下代码测试这是否正确:

from base64 import b64encode

text_binary = b'Hey'

# SGV5
print(b64encode(text_binary))

整个过程反向完成,在Base64解码后得到我们的原始数据。

现在,我将快速向您展示另一个单词 Heyo 的编码,以解释编码字符串中 = 的出现。

ASCII 索引值 8 位二进制值
H 72 01001000
e 101 01100101
y 121 01111001
o 111 01101111

一共有32位。这将为我们提供五个不同的 6 位组,其中有两个剩余位:11。我们用 0000 填充它们以获得 6 位组。根据上述排列将 6 位组成一组将得到以下结果:

010010 000110 010101 111001 011011 110000

重新排列的位将根据 Base64 索引值返回以下字符。

6 位二进制值 Base64 索引值
010010 18
000110 6 G
010101 21 V
111001 57 5
011011 27 b
110000 48 w

这意味着 Heyo 的 Base64 编码值为 SGV5bw==。每个 = 代表一对 00,我们添加它们用于填充原始位序列。

from base64 import b64encode

text_binary = b'Heyo'

# SGV5bw==
print(b64encode(text_binary))

对图像进行 Base64 编码

现在让我们开始讨论本文的重点。在本节中,我将向您展示如何使用 Python 轻松地对图像进行 Base64 编码。

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

Python を使用した Base64 エンコードとデコード

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

导入base64

为了对图像进行编码,我们只需使用函数 base64.b64encode(s) 即可。 Python对该函数的描述如下:

使用 Base64 对类似字节的对象 s 进行编码并返回编码后的字节。

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

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

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

打印 image_64_encode

Base64 解码图像

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

解码 Base64 编码的类似字节的对象或 ASCII 字符串并返回解码后的字节。

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

base64.decode(image_64_encode)

把它们放在一起

让我们将用于 Base64 编码和解码图像的程序放在一起。执行此操作的 Python 脚本应如下所示:

import base64
image = open('deer.gif', 'rb')
image_read = image.read()
image_64_encode = base64.b64encode(image_read)
image_64_decode = base64.b64decode(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

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

URL 安全编码和解码

正如我在本教程前面提到的,除了常规字母数字值之外,Base64 编码还使用字符 +/ 。但是,这些字符在 URL 中具有特殊含义。这意味着使用这些字符的 Base64 编码值如果在 URL 内部使用,可能会导致意外行为。

此问题的一种解决方案是使用 urlsafe_base64encode()urlsafe_base64decode() 函数对任何数据进行编码和解码。这些函数在编码过程中将 + 替换为 -,将 / 替换为 _

下面是一个 Python 示例,显示了这种差异:

import base64

image = open('dot.jpg', 'rb')
image_data = image.read()

unsafe_encode = base64.b64encode(image_data)
safe_encode = base64.urlsafe_b64encode(image_data)

# b'/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNr....
print(unsafe_encode)

# b'_9j_4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP_sABFEdWNr....
print(safe_encode)

学习Python

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

这篇文章已根据 Nitish Kumar 的贡献进行了更新。 Nitish 是一名 Web 开发人员,拥有在各种平台上创建电子商务网站的经验。他将业余时间花在个人项目上,让他的日常生活变得更轻松,或者在晚上与朋友一起散步。

以上がPython を使用した Base64 エンコードとデコードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。