Webでバイナリデータを送信するためにbase128ではなくbase64のみが使用されるのはなぜですか?ASCII文字セットには128文字があり、理論的にはbase 128を表すことができますが、ほとんどの場合、base128ではなくbase64のみが使用されます。
Webでバイナリデータを送信するためにbase128ではなくbase64のみが使用されるのはなぜですか?ASCII文字セットには128文字があり、理論的にはbase 128を表すことができますが、ほとんどの場合、base128ではなくbase64のみが使用されます。
回答:
問題は、ASCII文字セットの少なくとも32文字が「制御文字」であり、受信端末によって解釈される可能性があることです。たとえば、受信端末のチャイムを鳴らすBEL(ベル)文字があります。SOT(送信開始)とEOT(送信終了)の文字があり、それらの名前が示すとおりに機能します。また、CRとLFの文字も忘れないでください。これらは、データ構造をシリアル化/ストリームにフラット化する方法で特別な意味を持つ場合があります。
アドビは、ASCII文字セットでより多くの文字を使用するためにBase85エンコーディングを作成しましたが、AFAIKは特許によって保護されています。
これらの128文字の一部は印刷できないためです(主にコードポイント0x20未満の文字)。したがって、それらは確実に回線を介してストリングとして送信できません。また、コードポイント128を超えると、システム間で異なるエンコーディングが使用されるため、エンコーディングの問題が発生する可能性があります。
他の回答ですでに述べたように、重要な点は、文字セットを印刷可能な文字セットに減らすことです。basE91は、より大きな文字セットを使用し、低いASCII範囲の制御/空白文字を回避するため、より効率的なエンコードスキームです。Webページには、バイナリとbase64とbasE91のエンコード効率の優れた比較が含まれています。
Java実装を一度クリーンアップしました。人々が興味があれば、GitHubにプッシュすることができます。
更新:現在GitHubにあります。
最初の32文字が制御文字であることは、128文字を取得するために使用する必要がないため、まったく関係ありません。256文字から選択でき、最初の32文字だけが制御文字です。これは192文字を残すため、128文字は制御文字を使用しなくても完全に可能です。
その理由は次のとおりです。見た目が同じで、どこにでもコピーして貼り付けることができる必要があります。そのため、フォーラム、チャット、電子メールなどで同じように表示される文字でなければなりません。つまり、私たちは文字を使用できません。フォーラム/チャット/電子メールクライアントは通常、フォーマットや無視に使用できます。また、フォント、言語、地域の設定に関係なく、同じ文字でなければなりません。
それが理由です!
Base64は、さまざまな問題を解決するため一般的です(考えられるほぼすべての場所で機能します)。
トランスポートが8ビットクリーンであるかどうかを心配する必要はありません。
エンコーディング内のすべての文字が印刷可能です。あなたはそれらを見ることができます。コピーして貼り付けることができます。URL(特定のバリアント)で使用できます。等
固定エンコードサイズ。m
バイトは常にn
バイトにエンコードできることがわかっています。
誰もがそれを聞いたことがあります-それは広くサポートされており、多くのライブラリーであり、相互運用が簡単です。
Base128には、これらすべての利点があるわけではありません。
見た目は8ビットのクリーンですが、base64は65個のシンボルを使用していることを思い出してください。帯域外の文字がないと、エンコードサイズが固定されるという利点はありません。帯域外の文字を使用すると、8ビットクリーンにすることができなくなります。
しかし、それはすべて否定的ではありません。
base128はbase64よりもエンコード/デコードが簡単です-シフトとマスクを使用するだけです。組み込み実装にとって重要になる可能性があります
base128は、利用可能なビットをより多く使用することにより、トランスポートをbase64よりもわずかに効率的に使用します。
人々は base128を使用しています-私は今それを何かのために使用しています。それはそれほど一般的ではありません。
えさじそうです。Base64は、テキストのみを期待するプロトコルを使用して送信するバイナリデータをエンコードするために使用されます。それはWikiエントリの中にあります。
base128 PHPクラスをチェックアウトしてください。ISO 8859-1文字セットによるエンコードとデコード。