なぜBase64を使用するのですか? 質問する

なぜBase64を使用するのですか? 質問する

ウィキペディア言う

Base64 エンコード方式は、テキスト データを処理するように設計されたメディアを介して保存および転送する必要があるバイナリ データをエンコードする必要がある場合によく使用されます。これにより、転送中にデータが変更なしでそのまま維持されます。

しかし、マシンのメモリはバイナリを保存し、それをどのように解釈するかによって決まるため、データは常にバイナリで保存/送信されるのではないですか? したがって、ビット パターンを ASCII でエンコードするか、Base64 でエンコードするかに関係なく010011010110000101101110Man最終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

これにより、同じ情報量に対して転送されるデータ量が増えるという犠牲を払って、たとえ受信側が文字セットの残りの部分について異なる解釈をしたとしても、受信側が意図したとおりにデータをデコードできるようになります。

ベストアンサー1

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

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

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


コンピューターは 0 と 1 の 2 進数で通信しますが、人々は通常、テキストや画像などのより豊富な形式のデータで通信したいと考えています。コンピューター間でこのデータを転送するには、まず 0 と 1 にエンコードして送信し、その後再びデコードする必要があります。テキストを例にとると、このエンコードを実行する方法は多数あります。全員が 1 つのエンコードに同意できれば、はるかに簡単になりますが、残念ながらそうではありません。

もともと多くの異なるエンコーディングが作成されました(例:ボードットコード)は文字ごとに異なるビット数を使用していましたが、最終的には1文字あたり7ビットのASCIIが標準になりました。しかし、ほとんどのコンピュータはバイナリデータを8ビットのバイトで保存するため、アスキーこのタイプのデータの転送には適していません。一部のシステムでは、最上位ビットが消去されることもあります。さらに、システム間での行末エンコーディングの違いにより、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

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

おすすめ記事