1. ホーム
  2. json

[解決済み] バイナリデータをJSON文字列で。Base64より優れたもの

2022-03-14 03:43:58

質問

その JSON形式 は、ネイティブではバイナリデータをサポートしていません。バイナリデータは、JSONの文字列要素(すなわち、バックスラッシュエスケープを使用した二重引用符内のゼロまたはそれ以上のユニコード文字)に配置できるようにエスケープされなければならない。

バイナリデータをエスケープする方法として、Base64を使用することは明らかである。しかし、Base64は処理のオーバーヘッドが大きい。また、3バイトを4文字に展開するため、データサイズが約33%増加する。

のv0.8ドラフトは、このための1つのユースケースです。 CDMIクラウドストレージAPI仕様 . REST-Webservice で JSON を使用してデータオブジェクトを作成します。

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文字列にエンコードするための、より良い方法や標準的な方法はあるのでしょうか?

どのように解決するのですか?

JSONの仕様では、1バイトで表現できるユニコード文字は94文字です(JSONがUTF-8で伝送される場合)。それを考えると、スペース的にベストなのは ベース85 これは4バイトを5文字で表現するものです。しかし、これはbase64に比べて7%しか改善されておらず、計算コストも高く、実装もbase64に比べて少ないので、おそらく勝ち目はないでしょう。

また、すべての入力バイトをU+0000~U+00FFの対応する文字に単純にマッピングし、これらの文字を渡すためにJSON標準が要求する最低限のエンコーディングを行うこともできます。この場合の利点は、必要なデコーディングが組み込み関数以外にはないことですが、空間効率が悪く、105%の拡張(すべての入力バイトが同等の可能性を持つ場合)と、base85の25%、base64の33%に相当します。

最終判断:Base64は、一般的で簡単、そして悪くないという理由で、私の意見ではBase64の勝ちです。 十分 ということです。

こちらもご覧ください。 ベース91 ベース122