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