バイナリからテキストへのエンコード
バイナリからテキストへのエンコーディングは、プレーンテキストでのデータのエンコーディングです。より正確には、一連の印刷可能な文字のバイナリデータのエンコードです。これらのエンコードは、チャネルでバイナリデータ(電子メールやNNTPなど)が許可されていない場合、または8ビットクリーンでない場合にデータを送信するために必要です。 PGPのドキュメント(RFC 4880)では、Base64を指す場合、バイナリからテキストへのエンコードにASCIIアーマーという用語を使用しています。
説明
ASCIIテキストエンコーディング標準では、128個の一意の値(0〜127)を使用して、英語で一般的に使用されるアルファベット、数字、および句読点文字に加えて、印刷可能な文字を表さない制御コードを選択します。たとえば、大文字AはASCII文字65、数字2はASCII 50、文字}はASCII 125、メタ文字のキャリッジリターンはASCII 13です。ASCIIベースのシステムは、これらの値をデジタルで表すために7ビットを使用します。
対照的に、ほとんどのコンピューターは、8ビットバイトで編成されたメモリにデータを保存します。マシンで実行可能なコードと非テキストデータを含むファイルには、通常、256個の可能な8ビットバイト値がすべて含まれています。多くのコンピュータープログラムは、7ビットテキストと8ビットバイナリデータのこの区別に依存するようになり、ASCIIテキストのみを含むと予想されるデータに非ASCII文字が含まれていると、正しく機能しません。たとえば、8番目のビットの値が保持されない場合、プログラムは127を超えるバイト値を、何らかの機能を実行するよう指示するフラグとして解釈する場合があります。
ただし、画像ファイルを電子メールメッセージに添付する場合など、テキストベースのシステムを介して非テキストデータを送信できることが望ましい場合がよくあります。これを実現するために、データは何らかの方法でエンコードされ、8ビットデータは7ビットASCII文字にエンコードされます(通常は英数字と句読文字(ASCII印刷可能文字)のみを使用)。宛先に無事到着すると、8ビット形式にデコードされます。このプロセスは、バイナリからテキストへのエンコーディングと呼ばれます。 PGPやGNU Privacy Guard(GPG)など、多くのプログラムがこの変換を実行してデータ転送を可能にします。
プレーンテキストのエンコード
バイナリからテキストへのエンコード方法は、プレーンテキストをエンコードするためのメカニズムとしても使用されます。例えば:
- 一部のシステムでは、処理できる文字セットがより制限されています。 8ビットクリーンでないだけでなく、すべての印刷可能なASCII文字を処理できないものもあります。
- 他のシステムでは、RFC 2821で許可されているように、一部のSMTPソフトウェアの「1行あたり1000文字」の制限など、改行間に表示される文字数に制限があります。
- さらに、ヘッダーまたはトレーラーをテキストに追加するものもあります。
- いくつかのよく知られていないがまだ使用されているプロトコルはインバンドシグナリングを使用し、特定のパターンがメッセージに表示されると混乱を引き起こします。最もよく知られているのは、mboxファイル形式のメールメッセージを区切るために使用される行の先頭の文字列 "From"(末尾のスペースを含む)です。
すでにプレーンテキストであるメッセージに対してバイナリからテキストへのエンコードを使用し、もう一方の側でデコードすることにより、そのようなシステムを完全に透過的に見せることができます。これは、「ASCIIアーマー」と呼ばれることもあります。たとえば、ASP.NETのViewStateコンポーネントは、区切り文字の衝突を回避するために、base64エンコードを使用してHTTP POSTを介してテキストを安全に送信します。
エンコーディング標準
次の表は、バイナリからテキストへのエンコーディングの最も使用されている形式を比較しています。リストされている効率は、入力のビット数とエンコードされた出力のビット数の比率です。
エンコーディング | データ・タイプ | 効率 | プログラミング言語の実装 | コメント |
---|---|---|---|---|
Ascii85 | 任意 | 80% | awk、C、C(2)、C#、F#、Go、Java Perl、Python、Python(2) | このエンコードには、Base85、btoaなどのいくつかのバリアントがあります。 |
Base16(16進数) | 任意 | 50% | ほとんどの言語 | |
Base32 | 任意 | 62.5% | ANSI C、Java、Python | |
Base36 | 任意 | 〜64% | bash、C、C ++、C#、Java、Perl、PHP、Python、Visual Basic、Swift、その他多数 | アラビア数字0〜9およびラテン文字A〜Z(ISO基本ラテンアルファベット)を使用します。 TinyURLやSnipURL / SniprなどのURLリダイレクトシステムでコンパクトな英数字識別子としてよく使用されます。 |
ベース58 | 整数 | 〜73% | C ++、Python | Base64に似ていますが、印刷時にあいまいに見える可能性のある英数字以外の文字と文字の両方を避けるために変更されました。 |
Base64 | 任意 | 75% | awk、C、C(2)、Python、その他多数 | |
Base85(RFC 1924) | 任意 | 80% | C、Python Python(2) | Ascii85の改訂版。 |
BinHex | 任意 | 75% | Perl、C、C(2) | MacOSクラシック |
Intel HEX | 任意 | 〜50% | Cライブラリ、C ++ | 通常、EPROM、NOR-Flashメモリチップのプログラミングに使用 |
MIME | 任意 | Quoted-printableおよびBase64を参照 | Quoted-printableおよびBase64を参照 | 電子メールのような形式のエンコードコンテナー |
Sレコード(モトローラヘクス) | 任意 | 49.6% | Cライブラリ、C ++ | 通常、EPROM、NOR-Flashメモリチップのプログラムに使用されます。 49.6%は、レコードごとに255バイナリバイトを想定しています。 |
パーセントエンコーディング | テキスト(URI)、任意(RFC1738) | 〜40%(33–70%) | C、Python、おそらく他の多くの | |
引用印刷可能 | テキスト | 〜33〜100% | おそらく多くの | 改行を保持します。 76文字で行を切り取ります |
Uuencoding | 任意 | 〜60%(最大70%) | Perl、C、Java、おそらく他の多くの | MIMEとyEncにほぼ置き換えられました |
Xxencoding | 任意 | 〜75%(Uuencodingに類似) | C | ASCIIとEBCDICシステム間の文字セット変換の問題を回避するためにUuencodingデータの破損を防ぐためにUuencodingの代替として提案(および時々使用) |
yEnc | 任意、大部分は非テキスト | 〜98% | C | CRCチェックサムを含む |
RFC 1751(S / KEY) | 任意 | 33% | C、Python、... | 「人間が読み取れる128ビットキーの規則」。一連の小さな英単語は、10進数や他のバイナリからテキストへのエンコードシステムよりも、人間が読みやすく、覚えやすく、入力しやすいです。各64ビットの数値は、公開されている2048ワード辞書から、それぞれ1〜4文字の6つの短いワードにマップされます。 |
95のisprintコード32〜126は、ASCII印刷可能文字として知られています。
いくつかの古い、そして今日では珍しい形式には、BOO、BTOA、およびUSRエンコーディングが含まれます。
これらのエンコーディングのほとんどは、すべてのASCII印刷可能文字のサブセットのみを含むテキストを生成します。たとえば、base64エンコーディングは、大文字と小文字(A〜Z、a〜z)、数字(0〜9)のみを含むテキストを生成します、および「+」、「/」、および「=」記号。
これらのエンコーディングの一部(quoted-printableおよびパーセントエンコーディング)は、許可される文字のセットと単一のエスケープ文字に基づいています。許可される文字は変更されずに残りますが、他のすべての文字はエスケープ文字で始まる文字列に変換されます。この種の変換により、文字と数字は許可された文字の一部であり、エンコードされたテキストのままであるため、結果のテキストはほとんど読みやすくなります。これらのエンコードは、ほとんどが印刷可能なASCIIである入力に対して、最短のプレーンASCII出力を生成します。
いくつかの他のエンコーディング(base64、uuencoding)は、6ビットのすべての可能なシーケンスを異なる印刷可能文字にマッピングすることに基づいています。 26 = 64を超える印刷可能な文字があるため、これは可能です。指定されたバイトシーケンスは、ビットストリームとして表示し、このストリームを6ビットのチャンクに分割して、対応する文字のシーケンスを生成することにより変換されます。エンコードの違いは、ビットと文字のシーケンス間のマッピングと、結果のテキストのフォーマット方法が異なります。
一部のエンコード(BinHexのオリジナルバージョンとCipherSaberの推奨エンコード)は、6ビットではなく4ビットを使用し、4ビットのすべての可能なシーケンスを16の標準16進数にマッピングします。エンコードされた文字ごとに4ビットを使用すると、base64よりも50%長い出力が得られますが、エンコードとデコードは簡略化されます。
PETSCIIの最初の192個のコードのうち、164個は引用時に5(白)、17〜20および28〜31(色とカーソルコントロール)、32〜90(ascii相当)、91〜127(グラフィック)、129(オレンジ)、133〜140(ファンクションキー)、144〜159(色とカーソルコントロール)、および160〜192(グラフィック)。これにより、理論的には、PETSCIIを話すマシン間でbase128などのエンコードが可能になります。
ノート
- ^任意のデータの場合; 189のすべての非予約文字を3バイトでエンコードし、残りの66文字を1バイトでエンコードします。
- ^テキスト用。 18個の予約文字のそれぞれのみをエンコードします。
- ^ = XXとして保存される1バイト。必要のない94文字を除くすべてのエンコード(スペースとタブを含む)。