0

WebSocket で使用できるバイナリ データのエンコードの代替手段は何ですか? Base64を使用できることだけを知っています。他にもありますか?

4

2 に答える 2

4

WebSocket をサポートする基本的にすべてのブラウザーが、型付き配列 (arraybuffers) および Blob を介した生のバイナリ データの送受信をサポートするようになったため、テキストとしてのバイナリ データのエンコードはほとんど必要なくなりました。これが必要になるのは、ごくわずかな場合です。

  • Internet Explorer 6-9 や firefox 3.6 など、WebSocket サポートが組み込まれていないブラウザーでweb-socket-jsフォールバックを使用する。web-socket-js がバイナリ データをサポートしていない理由は、これらのブラウザが型付き配列と Blob をサポートしていないためです。そのため、「バイナリ」データはすでにブラウザで何らかの方法でエンコードされているためです (多くの場合、0 から 255 までの数値の通常の配列として)。 ) または非 ASCII 文字値の文字列として。
  • バージョン 6 未満の Safari (モバイルおよびデスクトップ) など、WebSocket Hixie プロトコル (未加工のバイナリ データを送信する機能がない) のみをサポートするブラウザー。

そのような状況では、base64 が唯一のエンコーディング オプションではありません。有効な UTF-8 テキスト (WebSocket のすべてのバージョンでサポートされるテキスト形式) になるエンコードはすべて機能します。Base64 は、たまたま、atob および btoa 関数を介してブラウザーでサポートするのが非常に簡単です。たとえば、バイナリ バイト値を表す数値の配列がある場合、これを任意の WebSocket バージョンを介して安全に送信できる JSON 文字列にエンコードできます。

JSON.stringify([120,32,255])
'[120,32,255]'

シンプルで人間が読める形式ですが、base64 よりもスペース効率がかなり劣ります。バイナリ データを UTF-8 文字列にエンコードするより効率的な方法もあり、スペース効率が大幅に向上しますが、ブラウザでより多くの CPU リソースを消費することになり、バイナリ データを UTF にマップするためのカスタム アルゴリズムが必要になります。 8 コードポイント。

于 2013-07-03T15:57:17.457 に答える
2

WebSocket は生のバイナリ データをサポートします。これがどのように公開されるかは、使用している言語/ライブラリ/API によって異なります。JavaScript/ブラウザでは、型指定された配列 (ArrayBuffer または Blob) を使用して send を呼び出すことができます。バイナリ メッセージを受信すると、それらのタイプの 1 つとして配信されます。WebSocket ブラウザー API のドキュメント ( http://www.w3.org/TR/websockets/ ) には、これがどのように行われるかについての詳細が記載されています。

于 2013-07-03T14:15:11.473 に答える