Y's note

Web技術・プロダクトマネジメント・そして経営について

本ブログの更新を停止しており、今後は下記Noteに記載していきます。
https://note.com/yutakikuchi/

Pythonでbase64エンコード・デコードする方法

import base64でできる

バイナリデータをASCII文字列化する手段の一つであるbase64encode・decodeをpythonでやる方法。import base64によりすごく簡単にできる。エンコード:base64.b64encod、decode:base64.b64decode。Paddingには'='が使用される様子。以下はサンプルサンプルコードでバイナリ形式のimageファイルを読み込み、base64encodeを行い、encodeした文字列からdecode関数で元ファイルのバイナリと同じであるかどうかを確認している。

#! /usr/bin/env python
# -*- coding:utf-8 -*-

import base64

#file読み込み
file = open('./image.jpg', 'rt').read()
#base64でencode
enc_file = base64.b64encode( file )
#encodeしたascii文字列を出力
print enc_file
#decodeしてもとデータに変換
dec_file = base64.b64decode( enc_file )
#decodeしたデータと元データを比較
if file == dec_file :
    print 'SAME'
else :
    print 'NOT SAME'

encode結果(一部)

VQOeSpPIrtIP2jv2f59HklHxv+Eu2QCVI5/F1jGy55IwZMgg9iM1/K9iis4YSKd7jeLk1sf1QTftEfAWeymB+N/wfWRk5P8AwmNhkEjt+9/OstPj/wDAUps/4Xb8I41+YqD4xsQME5wcS9e+PWv5cqKp4WL6k/WZH9REH7QPwGtlljl+NXwmuELlkceMLDPfr++57dajHx8+BlxbO5+NXweiLJgA+M7EHqDn/W8EZNfy90VDwUL7l/W5H9NU/wAefgoJ0D

urlsafeをサポート

urlにbase64encodeした文字列を含めたい時に有用。なぜならば'/','+'はurlのパスやquery文字列に使用されるので変換が必要となる。pythonの場合は'/'を'_'、'+'を'-'に変換するurlsafe形式を組み込み関数でサポートしている。※他の言語だとdecode/encodeの前後で文字列を自前で変換する。encode:base64.urlsafe_b64encode、decode:base64.urlsafe_b64decodeを利用する。以下はサンプルコード。

#! /usr/bin/env python
# -*- coding:utf-8 -*-

import base64

#file読み込み
file = open('./image.jpg', 'rt').read()
#base64でencode
enc_file = base64.urlsafe_b64encode( file )
#encodeしたascii文字列を出力
print enc_file
#decodeしてもとデータに変換
dec_file = base64.urlsafe_b64decode( enc_file )

encode結果(一部)
上のencode結果と比べると'/','+'がそれぞれ置換されていることが分かる。

VQOeSpPIrtIP2jv2f59HklHxv-Eu2QCVI5_F1jGy55IwZMgg9iM1_K9iis4YSKd7jeLk1sf1QTftEfAWeymB-N_wfWRk5P8AwmNhkEjt-9_OstPj_wDAUps_4Xb8I41-YqD4xsQME5wcS9e-PWv5cqKp4WL6k_WZH9REH7QPwGtlljl-NXwmuELlkceMLDPfr--57dajHx8-BlxbO5-NXweiLJgA-M7EHqDn_W8EZNfy90VDwUL7l_W5H9NU_wAefgoJ0D

base32,base16もサポート

base32,base16もサポートしており、base64.b32encode/base64.b32decode, base64.b16encode/base64.b16decodeといった関数がそれぞれ用意されている。

#! /usr/bin/env python
# -*- coding:utf-8 -*-

import base64

#file読み込み
file = open('./image.jpg', 'rt').read()
#base32でencode
enc_32file = base64.b32encode( file )
enc_16file = base64.b16encode( file )
#encodeしたascii文字列を出力
print enc_32file
print enc_16file
#decodeしてもとデータに変換
dec_32file = base64.b32decode( enc_32file )
dec_16file = base64.b16decode( enc_16file )

base32encode結果(一部)

MPJIUKSRLUERRNW4N3W4OA4KKCTWJJ3TOA4OA74FCRIN5JKYIO4EQCDT6NT3B5XWVEGGJSTTESG7YPER5FCRLLC6QFQ2RJM4FFTMRYBXDGUMJDGMK6GHHUCRIVFG5ZB5ZEIJNWQLDZ66UZMLPMUWSJBE446I5VCRK3CDRRBSXB3BT24MPL6STIJTXALWHU5Q74FCRJOUBD7GMJDPMGHJQAUNXFJEWN2PNIUKNACFZH7CN7HKIVA3IHFWP22FCWMBFGEGP3ZXL5VBEPEOLX7U74FCRIFOQNBPZQ7GN7HKJ4UURZFX45CRLIKWGZ2PKC3I4AJ75MHX6YKFCRLIRTH776Z

base16encode結果(一部)

4884B6D058F3EF532C5BD94B49212739E476A28AB621C62195C3B0CF5C63D7E94D099DC0BB1E9D87F851452EA047F331237B0C74C0146DCA9259BA7B514534022E4FF137E7522A0DA0E5B3F5A28ACC094C433F79BAFB5091E472EFFA7F8514505741A17E61F337E752794A4725BF3A28AD0AB1B3A7A85B47009FF587BFB0A28A2B44667FFFD9