Base64 エンコーディングとは
Base64 はエンコード技術の一つで、画像や動画などのバイナリデータを ASCII 形式(コンピュータシステムでテキストデータを表現するためのエンコード方式)に変換するものです。バイナリデータは0と1の文字列で構成されているため、Base64エンコーディングはこれらの文字をASCIIの明確な集合に変換することで機能します。その結果、ASCII文字をバイナリ値にマッピングすることで簡単にデコードすることができます。
以下は、Base64エンコーディングで使用される標準的なASCII文字のリストです。- 数字文字。0-9.
- 大文字のアルファベット。大文字アルファベット:A-Z
- 小文字のアルファベット:a-z。
- 2つの特殊文字。"/." と “+” です。
なぜBase64エンコーディングが使われるのか?
オンラインでファイル転送を行う場合、ファイルからのバイナリデータはパケットと呼ばれる塊に切り分けられます。これらは、異なるプロトコルを使用して受信者に送信されます。
ここで問題が発生する。受信者が送信者からのバイナリファイル形式をデコードできない場合、データの損失や破損につながる可能性があります。そのため、送信前にまずBase64エンコーディングを使ってファイルを隠蔽するのが良い方法とされています。Base64は文字をASCII形式にエンコードするため、大半のマシンが読むことができます。そして、Base64エンコーディングが広く採用されていることから、基本的にどのマシンでもBase64エンコーディングを採用することができます。Base64エンコーディングは何に使われるか
Base64は、テキスト、画像、音楽、動画など、ウェブ上で送信したいものをエンコードするために広く使われています。Base64の確立された使用例の1つは、電子メールの添付ファイルです。電子メールに添付されたファイルは、電子メールと一緒に宛先に送信される前に、舞台裏でBase64を使ってエンコードされます。
Base64では、エンコードされた画像を直接HTML文書やCSSファイルに追加することができます。このテクニックは、クライアントからのリクエストの数を減らし、ウェブサイトのパフォーマンスを向上させるのに役立ちます。しかし、エンコードする前に画像を圧縮する必要があります。そうしないと、ファイルサイズが非常に大きくなり、ウェブサイトの動作が遅くなります(代わりに、webpファイル形式を使用して画像を圧縮することもできます)。 大きなBLOB(Binary Large Object File)をインターネット上で転送する場合、Base64を使ってデータをエンコードすることは必須です。そうしないと、転送中にネットワークパケットが失われた場合、ファイル内のデータが破損し、ファイルが使用できなくなる可能性があるからです。 Base64エンコーディングのもう一つの人気のある、しかしどちらかというとニッチな使い方は、iPhoneのカスタム充電サウンドの設定です。新しい充電音は、AppleのモバイルデバイスのShortcutsアプリを使って、ASCIIにBase64エンコードすることができます。JavascriptでデータをBase64でエンコードする方法
Base64でデータをエンコード、デコードするには、Javascriptの2つのヘルパー関数 atob()
と btoa()
を利用することができます。これらの関数の名前は、その有用性を表しています。atob()関数はASCIIからバイナリに変換し、
btoa()`はバイナリからASCIIに変換することを意味します。
-
- 選択したブラウザでDeveloperコンソールを開きます。ほとんどのブラウザでは、
Ctrl
+Shift
+I
のショートカットキーで開くことができます。
- 選択したブラウザでDeveloperコンソールを開きます。ほとんどのブラウザでは、
-
- “Console “タブをクリックします。ここで、Javascriptを書き始めることができます。
3. この例では、“Hello “という文字列を格納した word
という名前の変数を定義します。
word="Hello" とします。
-
btoa()
関数を使用して、この文字列を Base64 ASCII 文字列に変換します。
let encodedString=btoa(word)
-
- “Hello “のBase64表現がどのようなものかを見るために、
encodedString
をコンソールに出力してください。
- “Hello “のBase64表現がどのようなものかを見るために、
console.log(encodedString)
を出力します。SGVsbG8=
PythonでBase64でデータをエンコードする方法
Pythonでは、組み込みのBase64 Python標準パッケージを使用することができます。
-
- Pythonファイル内で以下のコマンドを使用してライブラリをインポートします。
インポート base64
- 次に
base64.b64encode()
関数を使って、文字列を Base64 エンコードした ASCII 文字にエンコードします。この例では、“Hello’“を使用しています。
encoded = base64.b64encode(b'Hello')
- 結果をプリントアウトして、“Hello” が Base64 フォーマットでどのように見えるかを見てみましょう。
print(encoded)
LinuxでBase64でエンコード&デコードする方法
すべてのLinuxディストリビューションには、Base64のエンコードとデコードのユーティリティが付属しています。Windowsであれば、Windows subsystem for Linux (WSL)を使って、以下のターミナルコマンドを実行することができます。
コマンドラインでの実行
- 文字列をBase64エンコーディングに変換するには、まず値を
echo
して、その出力をBase64コマンドにパイプします。
echo "MTE" | base64
2. Base64でエンコードされた文字列をデコードするには、 --decode
または Base64 ユーティリティの -d
フラグを使用します。
echo "TVRFCg==" | base64 --decode
- Base64エンコーディングで画像を変換するには、
base64
コマンドの後に画像のパスを追加します。
base64 linux.jpg
- また、以下のコマンドで、出力されたBase64エンコーディングのASCII文字列をファイルに保存することができます。
base64 linux.jpg > test.txt
- 上記のコマンドでは、“linux.jpg “イメージの出力を “text.txt “ファイルに保存しています。これで、このテキストファイルは問題なくどこにでも転送できます。
6. ファイルから画像をデコードするには、Base64コマンドの後に-d
フラグを使用します。
base64 -d test.txt > test.jpg
オンラインのBase64コンバータを使う
オンラインのBase64コンバータはたくさんありますが、rapidtableのBase64コンバータは際立っています。このオンラインツールは、Base64テキストと画像のエンコードとデコードを行う便利な方法を提供します。
テキスト文字列をエンコードするには、テキストエリアに文字列を貼り付けて、エンコードボタンを押すだけです。このツールは、入力としてテキストファイルをサポートすることもできます。 文字エンコードセクションでは、ASCII、UTF8、UTF16などの追加オプションもあります。 他のオンラインの使いやすいBase64コンバータは以下の通りです。- Base64DecodeEncode
- CodeBeautify
- Emn178
Frequently Asked Questions (よくある質問)
なぜBase64でエンコードされたファイルは、通常のバイナリファイルより サイズが大きいのですか?
Base64 エンコーディングは 6bit システムを使用し、通常のバイナリファイルは 8bit システムを使用します。8ビットはバイトと呼ばれます。Base64では8ビットのASCII文字が出力されますが、Base64では6ビットのため、1バイトのデータに対して2ビットの空きがあります。計算すると、Base64でエンコードされたファイルは、元のファイルより33%大きくなります。
Base64エンコーディングは、暗号化にもなるのですか?
いいえ、エンコードと暗号化は別のものです。エンコーディングとは、ある形式を別の形式に変換することであり、暗号化とは、パスワードなしでは誰もアクセスできないように情報を隠すことです。暗号化されたファイルには通常、情報を解読するためのパスワードが必要ですが、エンコードされたファイルは適切なアルゴリズムを使用すれば簡単に解読することができます。
文字列がBase64エンコードされているかどうかを確認する方法は?
文字列がごちゃごちゃした文字の組み合わせのように見える場合は、Base64エンコードされている可能性があります。念のため、その文字列で使われている文字を見てください。A-Z、a-z、0-9、"+"、”/. “の範囲であれば、これはBase64でエンコードされた文字列となります。その値をデコードするには、上記のいずれかのテクニックを使用します。
Image credit: Markus Spiske via Unsplash All screenshots by Hrishikesh Pathak