Python学習講座

PythonエンジニアによるPython3学習サイト

TIPS

Base64によるエンコードとデコード


このページではBase64によるバイナリデータの文字列化とデコード化する方法について解説します。

Base64とは

Base64とはバイナリデータをテキストに変換する仕様の一つで、画像などをテキスト化する際に使われます。画像や鍵、暗号化データ、電子署名はバイナリなのですが、Base64を使用するとただのascii文字列になるため、メールやhtmlのtextフォームから送信することが可能となります。また、最近ではブラウザの通信回数を減らすために小さい画像Base64を使用するサービスも増えています。

(より具体的にはA–Z, a–z, 0–9 までの62文字と、記号2つ (+, /)、の64種類の文字を使用します。さらに一定の文字数に揃えるため = がパディングに用いられます。)

また、Base64に変換するとデータ量がおおよそ1.3倍程度増加する、という点には注意してください。

base64

Pythonでは標準ライブラリにその名もずばりbase64という名で提供されています。このため特に別途何かをインストールする必要はありません。さっそく使ってみましょう。

バイナリをBase64でエンコードする

base64.b64encode(バイナリ変数)でBase64エンコードが可能です。

以下のサンプルでは適当な文字列からバイトを作成し変換しています。

import base64

b64encoded = base64.b64encode(b'test text')
print(b64encoded.decode())  # dGVzdCB0ZXh0

Base64をデコードする

先程エンコードしたデータをデコードしてみましょう。デコードする場合はbase64.b64decodeを使用します。

import base64

b64encoded = base64.b64encode(b'test text')
data = base64.b64decode(b64encoded)
print(data)  # b'test text'

画像をBase64でエンコード/デコードする

当然画像もエンコード可能です。画像をバイナリとしてopenしてreadします。

import base64

f = open("python-logo.png", 'br')
b64_img = base64.b64encode(f.read())
print(str(b64_img)) # iVBORw0KGgoAAAANSUhEU・・・

f = open("python-logo.txt", "w")
f.write(b64_img.decode())

上のサンプルでは画像のpngファイルを読み出しBase64でエンコードしたものを文字列としてテキストデータに保存しています。

↓の画像は上のコードで生成したBase64で表示しています。

一方、保存したテキストをBase64でデコードしてpngに戻す場合は以下のように行います。


import base64

f = open("python-logo.txt", 'r')
data = f.read()
print(data)

img = base64.b64decode(data.encode())
f = open("python-logo2.png", 'bw')
f.write(img)

pngに限らず鍵や電子署名、pdf等でも同様にエンコードすることが可能ですので試してみてください。

-TIPS
-