バイナリデータをbase64エンコードしてデコードする
バイナリデータをHTTPなどでサーバーに送るとき、バイナリのままだと問題が生じる場合が多いです。
ネットワークのプログラミングではデータを送るときに適切なコンテンツヘッダを指定しなければなりませんが、それを間違えていた場合や、そもそもバイナリで送るのはサーバーの管理ポリシーで禁止されている場合など、厄介な問題が多々あります。
しかし、サーバーとのやりとりに文字列データを用いていれば問題が生ずることが皆無です。
バイナリのままネットワークやりとりするプログラミングでトラブルが生じ、どこに問題があるのか混乱してしまったら、いったん落ち着いて文字列のやり取りがちゃんとできるかどうか確認したほうがいいです。
下記のコードは
バイナリデータ → BASE64エンコード → 文字列データ
バイナリデータ ← BASE64デコード ← 文字列データ
という流れで、全く同じバイナリデータが得られるかどうかテストしたコードです。
import base64
from PIL import Image
import datetime
filepath_src = "c:/tmp/test_1024_0768.bmp"
filepath_dst = "c:/tmp/test_1024_0768_dst.bmp"
# ファイル全体をバイナリデータとして読みだす.
with open( filepath_src, "rb" ) as f_src:
data_bin_src = f_src.read()
# バイナリからBASE64文字列に変換する(エンコード).
str = base64.b64encode( data_bin_src )
# BASE64文字列からバイナリに変換する(デコード).
data_bin_dst = base64.b64decode( str )
# バイナリデータが要素ごとにすべて同じかどうか.
if ( data_bin_dst == data_bin_src ):
# バイナリとしてファイル保存する.
with open( filepath_dst, "wb" ) as f_dst:
f_dst.write( data_bin_dst )
print( "pass." )
else:
print( "fail." )
'''
# 元のファイルと、BASE64エンコード、デコードを経由したファイルを開く.
img_src = Image.open( filepath_src )
img_dst = Image.open( filepath_dst )
img_src.show()
img_dst.show()
'''
print( filepath_src )
print( filepath_dst )
# 終了メッセージ.
print( datetime.datetime.now() )
print( "finish." )
下記が実行結果です。
PS C:\tmp> python test.py
pass.
c:/tmp/test_1024_0768.bmp
c:/tmp/test_1024_0768_dst.bmp
2022-07-19 14:52:43.728520
finish.