JSON文字列のバイナリデータ。Base64よりも優れたもの 質問する

JSON文字列のバイナリデータ。Base64よりも優れたもの 質問する

JSON形式ネイティブではバイナリ データはサポートされません。バイナリ データは、JSON の文字列要素 (つまり、バックスラッシュ エスケープを使用して二重引用符で囲んだ 0 個以上の Unicode 文字) に配置できるようにエスケープする必要があります。

バイナリ データをエスケープする明白な方法は、Base64 を使用することです。ただし、Base64 では処理オーバーヘッドが大きくなります。また、3 バイトを 4 文字に拡張するため、データ サイズが約 33% 増加します。

このユースケースの1つは、CDMI クラウド ストレージ API 仕様JSONを使用してREST Webサービス経由でデータオブジェクトを作成します。例:

PUT /MyContainer/BinaryObject HTTP/1.1
Host: cloud.example.com
Accept: application/vnd.org.snia.cdmi.dataobject+json
Content-Type: application/vnd.org.snia.cdmi.dataobject+json
X-CDMI-Specification-Version: 1.0
{
    "mimetype" : "application/octet-stream",
    "metadata" : [ ],
    "value" :   "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz
    IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg
    dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu
    dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo
    ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=",
}

バイナリ データを JSON 文字列にエンコードするためのより良い方法や標準的な方法はありますか?

ベストアンサー1

JSON仕様によれば、1バイトで表現できるUnicode文字は94個あります(JSONがUTF-8で送信されている場合)。それを念頭に置いて、スペース的にできる最善のことはベース85これは 4 バイトを 5 文字として表します。ただし、これは base64 に比べて 7% の改善に過ぎず、計算コストが高く、実装は base64 よりも一般的ではないため、おそらくメリットはありません。

また、すべての入力バイトを U+0000-U+00FF の対応する文字に単純にマッピングし、JSON 標準で必要な最小限のエンコードを行ってそれらの文字を渡すこともできます。この場合の利点は、組み込み関数以外では必要なデコードが不要であることです。ただし、スペース効率は悪く、base85 の場合は 25%、base64 の場合は 33% であるのに対して、105% の拡張 (すべての入力バイトが同等の確率である場合) になります。

最終判定: 私の意見では、base64 が勝ちます。その理由は、一般的で、簡単で、置き換えるほど悪くないからです。

参照:ベース91そしてベース122

おすすめ記事