ASCII チャネル経由で送信する必要があるバイナリ データがある場合、どのテキスト エンコーディング スキームを使用しますか?
質問
エンコードする必要があるバイナリ データがある場合、どのようなエンコード スキームを使用しますか?
私は以下について知っています:
- 16 進エンコーディング. 。非常に単純ですが、かなり冗長で、1 バイトを 2 バイトに展開します。
- 64 進数. 。最も一般的なものは、それほど冗長ではありませんが、3 バイトを 4 バイトに拡張します。
- 85 進数. 。一般的ではなく、また冗長ではありませんが、4 バイトを 5 バイトに拡張します。
他に一般的に使用されているエンコーディング スキームはありますか?もしそうなら、どのようなメリットとデメリットがありますか?
編集:これは、たとえば任意のデータを Cookie に保存しようとする場合に便利です。Cookie はテキストのみを保存でき、任意のデータは保存できないため、何らかの方法で変換する必要があります。できれば元に戻す方法も必要です。さらに、ステートレス サーバーを使用しているため、サーバー上に状態を保存できず、Cookie に識別子を入れるだけであると仮定します。もちろん、これを行う場合は、ユーザーがあなたに返しているものが、あなたがユーザーに渡したものであることを検証する何らかの方法 (たとえば、署名) も必要になります。
また、現在のコンセンサスは、base64 が普及しているため、base64 を使用するべきであるということです。そのため、これについても指摘しておきます。 は 私が使っているものは…誰かが他のものを使用したかどうか、もし使用した場合はその理由が知りたいです。
編集:誰かがこれに遭遇した場合に備えて、Base64 を使用してデータを Cookie に保存したい場合は、次のようにする必要があります。 変更されたBase64実装. 。見る この答え という理由で。
解決
Cookie 値をエンコードする場合は注意が必要です。これを参照してください 古い答え:
バージョン0のCookieでは、値には空白、括弧、括弧を含めてはなりません。 等号, 、コンマ、二重引用符、スラッシュ、疑問符、サイン、コロン、およびセミコロン。空の値は、すべてのブラウザで同じように動作しない場合があります。
Base64 エンコードにより生成できる =
特定の入力にはシンボルが使用されますが、これは技術的に Cookie では許可されていません (バージョン 0 Cookie は、最も広くサポートされています)。実際に私が疑っているのは、 =
実際にはうまく動作しますが、うまく動作しない可能性があります。
エンコードされたバイナリが Cookie と互換性があることを確実にするには、基本的な 16 進エンコードが最も安全であることをお勧めします (例: ジャワで).
編集: @Paulが有益に指摘したように、 Base 64 の修正バージョン それは「URL セーフ」です (そして、おそらく「Cookie セーフ」だと思います)。標準アルゴリズムの修正バージョンを使用すると、むしろその魅力が薄れてしまいます。
編集:@shoosh さんは、 =
は、base64 文字列の終わりを示すためにのみ使用されるため、 =
, 、Cookieを設定してから、 =
デコードする必要があるときに再度実行します。
他のヒント
Base64では勝ちます。私はエンコードされたバイナリデータに帯域幅やファイル・スペースを節約心配してきたすべてのアプリケーションに実行していない。
ワンス・アポン・ア・タイム、UTF-7がありました。これは公式に非推奨、それはまだACE(ASCII互換エンコーディング)として働いています。今 IDN にあります。