bin2base64.py 技術ドキュメント

プログラムの動作

bin2base64.py は、指定されたバイナリファイルをBase64形式にエンコードし、その結果を新しいファイルに保存するPythonスクリプトです。このプログラムの主な目的は、画像ファイル、音声ファイル、その他の任意のバイナリデータを、テキストとして安全に転送または保存できるようにすることです。これにより、バイナリデータをテキストベースのプロトコル(例: メール、HTTP POSTデータ、XML/JSON設定ファイル)で扱う際の互換性の問題が解決されます。

主な機能は以下の通りです。

  1. 入力ファイルの指定: コマンドライン引数で入力するバイナリファイル名を指定できます。指定がない場合は、スクリプトにハードコードされたデフォルトのファイル名を使用します。

  2. Base64エンコード: 入力ファイルをバイナリモードで読み込み、Pythonの標準ライブラリ base64 モジュールを使用してBase64形式にエンコードします。

  3. 出力ファイルの保存: エンコードされたデータを、元のファイル名に .base64 拡張子を付加した新しいファイルに保存します。

原理

このプログラムの核となる原理は「Base64エンコーディング」です。Base64は、バイナリデータをASCII文字列に変換するエンコーディングスキームの一つで、主にテキストデータしか扱えない環境でバイナリデータを転送するために使われます。

Base64エンコーディングの基本的な原理は以下の通りです。

  1. 3バイトを4文字に変換: バイナリデータは8ビットのバイトの連続です。Base64は、このバイナリデータを3バイト(\(3 \times 8 = 24\)ビット)ごとに区切ります。

  2. 6ビットごとのグループ化: 24ビットを、さらに6ビットずつの4つのグループに分割します。

  3. Base64文字へのマッピング: 各6ビットのグループは、0から63までの整数値を表します。この整数値は、Base64の変換テーブル(A-Z, a-z, 0-9, +, /)に対応するASCII文字にマッピングされます。これにより、3バイトのバイナリデータが4文字のBase64文字列に変換されます。

  4. パディング: 元のバイナリデータのバイト数が3の倍数でない場合、最後のグループにはパディングが必要になります。

    • もしバイナリデータが1バイト余る場合、それに2バイトのゼロパディングを行い、4文字のBase64文字列を生成し、最後の2文字を = で埋めます(例: XX=)。

    • もしバイナリデータが2バイト余る場合、それに1バイトのゼロパディングを行い、4文字のBase64文字列を生成し、最後の1文字を = で埋めます(例: XXX=)。

このプロセスにより、すべてのバイナリデータが英数字、+/、およびパディング文字=のみで構成されるテキスト形式に変換されます。

必要な非標準ライブラリとインストール方法

bin2base64.py は、Pythonの標準ライブラリである ossys、および base64 のみを使用しています。これらのライブラリはPythonの標準インストールに含まれているため、別途非標準ライブラリをインストールする必要はありません。

必要な入力ファイル

本プログラムは、以下のいずれかの方法で入力ファイルを指定します。

  • コマンドライン引数で指定: プログラム実行時に最初の引数としてファイル名を渡します。 例: python bin2base64.py my_image.jpg

  • デフォルトファイルを使用: コマンドライン引数が指定されない場合、スクリプト内にハードコードされている 250901_Bi2S3.raw を入力ファイルとして使用します。

入力ファイルは任意のバイナリファイル(例: .raw, .jpg, .png, .pdf, .zip など)が期待されます。プログラムはファイルをバイナリモード ('rb') で読み込むため、ファイルの内容がテキスト形式であるかバイナリ形式であるかは問いません。

生成される出力ファイル

プログラムは、Base64エンコードされたデータを含む単一のファイルを出力します。

  • ファイル名: 入力ファイル名から拡張子を取り除き、.base64 という拡張子を付加した名前で保存されます。 例:

    • 入力ファイルが 250901_Bi2S3.raw の場合、出力ファイルは 250901_Bi2S3.base64 となります。

    • 入力ファイルが my_image.jpg の場合、出力ファイルは my_image.base64 となります。

  • 内容: 出力ファイルには、入力ファイルのバイナリデータがBase64形式でエンコードされたテキスト(バイト列)が含まれます。このファイルは通常、テキストエディタで開いて内容を確認できますが、改行コードは含まれません(Base64エンコードの一般的な慣習として、一定の文字数で改行を挿入することがありますが、このスクリプトでは行いません)。

コマンドラインでの使用例 (Usage)

bin2base64.py は以下の形式でコマンドラインから実行します。

python bin2base64.py [入力ファイル名]
  • [入力ファイル名] はオプションです。

    • 省略した場合、スクリプト内のデフォルトファイル (250901_Bi2S3.raw) が処理されます。

    • 指定した場合、そのファイルが処理されます。

コマンドラインでの具体的な使用例

例1: デフォルトの入力ファイルを使用する場合

まず、テスト用のダミーファイルを作成します。

echo -n "Hello, Base64!" > 250901_Bi2S3.raw

次に、引数なしでプログラムを実行します。

python bin2base64.py

実行結果:

infile='250901_Bi2S3.raw'
outfile='250901_Bi2S3.base64'
Base64エンコード済みファイルを保存しました: 250901_Bi2S3.base64

この実行により、250901_Bi2S3.base64 というファイルが生成されます。その内容を確認すると以下のようになります。

cat 250901_Bi2S3.base64

出力ファイルの内容:

SGVsbG8sIEJhc2U2NCE=

例2: 任意の入力ファイルを指定する場合

まず、別のテスト用ダミーファイルを作成します。今回はランダムなバイナリデータを使用します。

head -c 10 /dev/urandom > random_data.bin

次に、このファイルを引数としてプログラムを実行します。

python bin2base64.py random_data.bin

実行結果:

infile='random_data.bin'
outfile='random_data.base64'
Base64エンコード済みファイルを保存しました: random_data.base64

この実行により、random_data.base64 というファイルが生成されます。その内容を確認すると、ランダムな10バイトのデータがBase64エンコードされた結果が表示されます。

cat random_data.base64

出力ファイルの内容例: (ランダムなデータのため、毎回異なります)

N1Sws3gOqP8=