1. ホーム

[解決済み】なぜBase64を使うのか?

2022-03-25 16:16:04

質問

ウィキペディア は言う。

Base64エンコーディングは、テキストデータを扱うメディア上で保存・転送されるバイナリデータをエンコードする必要がある場合によく使われる方式です。これは、転送中にデータが変更されることなくそのままの状態を維持することを保証するためです。

しかし、データは常にバイナリで保存/送信されるのではないでしょうか?なぜなら、私たちのマシンが持っているメモリはバイナリを保存し、それをどう解釈するかによります。つまり、ビットパターンをエンコードしても 010011010110000101101110 として Man をASCIIで、または TWFu の場合、最終的には同じビットパターンを保存することになります。

究極のエンコーディングが0と1であり、あらゆるマシンやメディアがそれを扱えるのであれば、データがASCIIで表現されているかBase64で表現されているかは重要ではないでしょう?

テキストデータを扱うように設計されたメディアとはどういう意味ですか?バイナリを扱うことができます。


皆さんありがとうございます、これで理解できたと思います。

データを送るとき、そのデータがこちらの意図したとおりの形式で解釈されるかどうかはわからない。そこで、双方が理解できる何らかのフォーマット(Base64など)でコード化したデータを送ります。そうすれば、たとえ送り手と受け手が同じものを違うように解釈したとしても、コード化されたフォーマットで合意しているので、データが間違って解釈されることはないでしょう。

から マーク・バイヤーの例

を送信したい場合

Hello
world!

のようにASCIIで送るのも一つの方法です。

72 101 108 108 111 10 119 111 114 108 100 33

しかし、バイト10は、もう一方の端にある改行として正しく解釈されない可能性があります。そこで、ASCIIのサブセットを使って、次のようにエンコードします。

83 71 86 115 98 71 56 115 67 110 100 118 99 109 120 107 73 61 61

これは、同じ情報量に対してより多くのデータを転送する代償として、受信者が残りの文字セットについて異なる解釈をしたとしても、意図した方法でデータをデコードできることを保証するものです。

解決方法は?

最初の間違いは、ASCIIエンコーディングとBase64エンコーディングが互換性があると考えることです。そうではありません。それらは異なる目的のために使用されます。

  • ASCIIでテキストをエンコードする場合、テキスト文字列から始めて、それをバイト列に変換します。
  • Base64でデータをエンコードする場合、バイト列から始めてそれをテキスト文字列に変換します。

そもそもなぜBase64が必要だったのかを理解するためには、コンピュータの歴史を少し知る必要があります。


コンピュータは0と1という2進数で通信しますが、人々は通常、テキストや画像など、より豊かな形式のデータを通信したいと考えます。このデータをコンピュータ間でやり取りするためには、まず0と1にエンコードして送信し、再びデコードする必要があります。テキストを例にとると、このエンコードにはさまざまな方法があります。もし、私たちが一つのエンコーディングに合意できれば、もっとシンプルになるのですが、悲しいことにそうではありません。

もともと、さまざまなエンコーディングが作られていました(例. ボードーコード 最終的にはASCIIが1文字あたり7ビットの標準になりました。しかし、ほとんどのコンピュータはバイナリデータを8ビットで構成されるバイトに格納するため、1文字あたり7ビットのASCIIが標準となりました。 ASCII は、この種のデータの転送には不向きである。システムによっては、最上位ビットを削除してしまうものもあります。さらに、システムによって行末のエンコーディングが異なるため、ASCIIの10と13の文字が変更されることもありました。

これらの問題を解決するために ベース64 エンコーディングが導入されました。これにより、任意のバイトを、破損せずに送信しても安全であることが分かっているバイト(ASCIIの英数字といくつかの記号)にエンコードすることができます。欠点は、Base64でエンコードするとメッセージの長さが長くなることです。3バイトのデータは4つのASCII文字にエンコードされることになります。

テキストを確実に送信するには まず を任意のテキストエンコーディング(例えばUTF-8)でバイトにエンコードし、次に その後 Base64でエンコードしたバイナリデータを、ASCIIでエンコードして送信しても安全なテキスト文字列に変換します。受信者は、元のメッセージを復元するためにこのプロセスを逆転させる必要があります。もちろん、受信者はどのエンコーディングが使われたかを知る必要があり、この情報はしばしば別途送信する必要があります。

歴史的には、メールサーバーが行末を変更する可能性のある電子メールメッセージのバイナリデータのエンコードに使用されてきました。より現代的な例としては、Base64エンコーディングを使って HTMLソースコードに直接画像データを埋め込む . この場合、'<'や'>'などの文字がタグとして解釈されるのを避けるために、データをエンコードする必要があるのです。


以下は動作例です。

2行で構成されたテキストメッセージを送信したい。

こんにちは
世界!

ASCII(またはUTF-8)で送ると、次のようになります。

72 101 108 108 111 10 119 111 114 108 100 33

バイト10はシステムによっては破損しているので、これらのバイトをBase64エンコードしてBase64文字列とすることができます。

SGVsbG8Kd29ybGQh

これをASCIIでエンコードすると、次のようになります。

83 71 86 115 98 71 56 75 100 50 57 121 98 71 81 104

ここにあるバイトはすべて安全なバイトとして知られているので、どんなシステムでもこのメッセージを破損する可能性はほとんどありません。私はこれを元のメッセージの代わりに送り、受信者が逆のプロセスを経て元のメッセージを復元することができます。