エンジニアライフスタイルブログを運営しているミウラ(@miumiu06171)です。
普段はフリーランスでシステムエンジニアをしております。
今回は、Pythonのbase64ライブラリを使って文字・URL・画像をエンコード(符号化)とデコード(復号化)する方法を紹介していきます。
動作確認には、Visual Studio Code (VS Code) を使用しているため、同様に確認したい方は、こちらの記事でVS CodeのPython開発環境を構築してみてください。
Pythonで扱う文字集合と文字符号化方式
こちらのPythonドキュメントからPythonが扱う文字集合は「Unicode」、文字符号化方式は「UTF-8」の組み合わせで文字コードを表現しています。
Base64とは
Base64とは、バイナリデータをテキストに変換する仕様の一つで、下表に示す[A-Z][a-z][0-9][/][+]を含む64個の文字や記号で、文字・画像・暗号データなどをテキスト化するために使われます。
【Base64 Index Table】
番号 | 文字 | 番号 | 文字 | 番号 | 文字 | 番号 | 文字 | |||
---|---|---|---|---|---|---|---|---|---|---|
0 | A | 16 | Q | 32 | g | 48 | w | |||
1 | B | 17 | R | 33 | h | 49 | x | |||
2 | C | 18 | S | 34 | i | 50 | y | |||
3 | D | 19 | T | 35 | j | 51 | z | |||
4 | E | 20 | U | 36 | k | 52 | 0 | |||
5 | F | 21 | V | 37 | l | 53 | 1 | |||
6 | G | 22 | W | 38 | m | 54 | 2 | |||
7 | H | 23 | X | 39 | n | 55 | 3 | |||
8 | I | 24 | Y | 40 | o | 56 | 4 | |||
9 | J | 25 | Z | 41 | p | 57 | 5 | |||
10 | K | 26 | a | 42 | q | 58 | 6 | |||
11 | L | 27 | b | 43 | r | 59 | 7 | |||
12 | M | 28 | c | 44 | s | 60 | 8 | |||
13 | N | 29 | d | 45 | t | 61 | 9 | |||
14 | O | 30 | e | 46 | u | 62 | + | |||
15 | P | 31 | f | 47 | v | 63 | / |
Base64を使用するとテキスト化されるので、メール等の様々な通信手段で送信できるようになります。
エンコード(符号化)とデコード(復号化)とは
エンコード(符号化)とは、ある形式のデータを規則に基づいて、別の形式のデータに変換することです。
デコード(復号化)とは、エンコードの逆操作のことでエンコードしたものをデコードすると、元のデータに戻すことができます。
Pythonのbase64の基本的な使い方
エンコードとデコードが何かわかったところで、Python上でUnicode + UTF-8で表現される文字列をbase64ライブラリでエンコード・デコードする方法をみていきましょう。
Pythonのbase64ライブラリの詳細については、こちらのサイトを参照してください。
base64ライブラリでエンコード・デコードするときのイメージ図は、下図のとおりです。
上図をもとに次章では、まず文字列をbase64ライブラリでエンコード・デコードする方法を紹介していきます。
Pythonのbase64で文字列のエンコードとデコード
Pythonで文字列をBase64エンコード(base64.b64encode())
Pythonのbase64ライブラリでエンコードする場合、引数としてバイト列を指定する必要があります。
そのため、一旦対象の文字列を<文字列>.encode()によってバイト列に変換したものを引数として、base64.encode()を実行することで、base64でエンコードされたバイト列を得られます。
Pythonで文字列へBase64デコード(base64.b64decode())
Pythonのbase64ライブラリでデコードする場合、エンコードの逆操作になります。
base64でエンコードされたバイト列を引数として、base64.b64decode()を実行することで、バイト列を得られます。
このバイト列<bytes>.decode()を実行することで、もとの文字列に復号化できます。
Pythonのbase64でファイル名やURLパラメーター用にエンコードする
Base64のインデックステーブルには ‘/’ と ‘+’ が含まれるので、ファイル名 や URLパラメーターに使用できない。
このような場合に対応するためにbase64ライブラリには、urlsafe_b64encode関数とurlsafe_b64decode関数が用意されており、 ‘/’ は ‘-‘、 ‘+’ は ‘_’ で出力されるようになっています。
1 2 3 4 5 |
encBase64Bytes = base64.urlsafe_b64encode('https://yahoo.co.jp/'.encode()) print(encBase64Bytes) decBase64Bytes = base64.urlsafe_b64decode(encBase64Bytes) print(decBase64Bytes) print(decBase64Bytes.decode()) |
urlsafe_b64encode 関数 でエンコードした場合、urlsafe_b64decode 関数で元に戻すことができます。
Pythonのbase64で画像ファイル(バイナリファイル) を Base64 のテキストファイルにする
Pythonのbase64で画像ファイルをエンコード
b64encode関数で変換したデータをwriteで書き込むだけで画像ファイルをテキストファイルに保存できます。
1 2 3 4 5 |
with open('original.png', 'rb') as fr: textBytes = base64.b64encode(fr.read()) with open('image.txt', 'wb') as fw: fw.write(textBytes) |
Pythonのbase64で画像ファイルをデコード
b64decode関数で変換したデータをwriteで書き込むだけで画像として元に戻ります。
1 2 3 4 5 |
with open('image.txt', 'rb') as fr: textBytes = base64.b64decode(fr.read()) with open('restore.png', 'wb') as fw: fw.write(textBytes) |
png拡張子以外の画像も同様にエンコードすることが可能ですので試してみてください。
まとめ
いかがでしたでしょうか。
Pythonのbase64ライブラリの基本的な使い方を紹介してきました。
Webアプリケーションでファイルサイズが大きいメディアファイル等を通信する際は、base64でテキスト化して通信したりするので、base64ライブラリのエンコード・デコード方法を覚えておくとよいでしょう。
【関連記事】
【TIPS】Pythonのpyjwt(Json Web Token)でエンコード・デコードする方法
【TIPS】PythonのqrcodeでQRコード作成・保存・読み取り方法紹介