このページでは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等でも同様にエンコードすることが可能ですので試してみてください。
