[解決済み】なぜBase64を使うのか?
質問
ウィキペディア は言う。
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
ここにあるバイトはすべて安全なバイトとして知られているので、どんなシステムでもこのメッセージを破損する可能性はほとんどありません。私はこれを元のメッセージの代わりに送り、受信者が逆のプロセスを経て元のメッセージを復元することができます。
関連
-
[解決済み] base64文字列をエンコード、デコードするにはどうしたらいいですか?
-
[解決済み] HTMLでBase64画像を表示する方法
-
[解決済み] バイナリデータをJSON文字列で。Base64より優れたもの
-
[解決済み] JavaScriptで画像をBase64文字列に変換するにはどうすればよいですか?
-
[解決済み] Base64画像の埋め込み
-
[解決済み】Node.jsでBase64エンコードを行うにはどうすればよいですか?
-
[解決済み】JavaScriptで文字列をBase64にエンコードするにはどうすればいいですか?
-
[解決済み】円の円周上にある点を計算するには?
-
[解決済み】ポリゴンの膨張・収縮(オフセット、バッファリング)のためのアルゴリズム
-
[解決済み】純粋な関数型プログラミングの効率性
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] TSPの場合、Held-Karpアルゴリズムは、Brute-forceのO(n!)からO(2^n*n^2)に時間複雑性をどのように減少させるのでしょうか?[クローズド]
-
[解決済み] ループ不変量によるマージソートの正しさの証明 (初期化 , 保守 , 終了)
-
[解決済み] Zip爆弾はどうやって作るの?
-
[解決済み] 最大スパニングツリーの求め方は?
-
[解決済み] 深さ優先グラフアルゴリズムの時間複雑性【非公開
-
[解決済み】8歳児にビッグ・オー?[重複あり]
-
[解決済み】2つの整数を1つにマッピングする、一意的かつ決定論的な方法
-
[解決済み】log(n!)=Θ(n-log(n))なのか?)
-
[解決済み】動的計画法を用いて,最も長く増加する部分列を決定する方法とは?
-
[解決済み] [解答】ある数字が与えられたとき、元の数字と全く同じ桁数の次の数字を求めよ。