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エンコードされたbytes型を得ることできます。

以下のサンプルでは適当なバイトをbase64にエンコードしています。

import base64

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

Base64をデコードする

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

import base64

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

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

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

import base64

# 画像ファイルを開いてbase64に変換
with open("python-logo.png", 'br') as f1:
    b64_img = base64.b64encode(f1.read())
    print(str(b64_img))  # iVBORw0KGgoAAAANSUhEU・・・

# base64をテキスト形式で保存
with open("python-logo.txt", "w") as f2:
    f2.write(b64_img.decode())

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

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

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

import base64

# base64のテキストを開く
with open("python-logo.txt", 'r') as f3:
    data = f3.read()
    print(data)

# base64のテキストをbase64のbytes型に変換後、通常のbytes型に変換して保存
img = base64.b64decode(data.encode())
with open("python-logo2.png", 'bw') as f4:
    f4.write(img)

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