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