Base64でエンコードされたBSONはBSONよりも小さいですか?
3 に答える
Piskvorの権利、base64でエンコード-何でも生より長いです。サイズを縮小する手段としてではなく、限られた文字レパートリーでチャネルにダウンさせるために何かをbase64エンコードします。
おそらく、質問は次のようになります。Base64でエンコードされたBSONはJSONよりも小さいですか?
その場合、JSON-vs-BSONはコンテンツに大きく依存します。たとえば、のような任意の浮動小数点数1.2345678901234567
は、JSON文字列の数字バージョンよりもBSONの8バイナリバイトに効率的に格納されます。ただし、たとえば、などのより一般的な数値は、1
JSONの文字列としてはるかに効率的に保存されます。
文字列値の場合、BSONは長さの単語で4バイトを失いますが"
、\
JSONはエスケープする必要があり、JSONが16進シーケンスを使用する必要がある制御文字を含む文字列ではさらに多くのバイトを取得します。(一部のJSONエンコーダー\u
は、文字セットに関係なく安全な送信を保証するために、すべての非ASCII文字もエスケープします。)
IMO:BSONには、一般的にJSONに比べてコンパクトさの大きな利点はありません。その強みは、低水準言語でのデコードの単純さに加えて、JavaScriptにはないデータ型にあります。バイナリ文字列やその他のいくつかのケースでは、わずかな利点があります。特定のワークロードをチェックすることは確かに価値があります。しかし、BSON仕様自体の例はJSONではかなり小さいことを示しています。
base64でエンコードされたBSONの場合:33%悪いことを除いて、同じです。
いいえ:base64では、3バイトのプレーンテキストが4バイトのエンコードされたテキストになるため、データペイロードが何であっても、結果は常に大きくなります。参照: http: //en.wikipedia.org/wiki/Base64
bsonを短縮するための私の解決策としてこれを書いたばかりです。確認してください。
var bsonShortify = {
encode:function(bson){
return this._hex2urlBase(bson.substr(0,bson.length/2))+this._hex2urlBase(bson.substr(bson.length/2,bson.length/2));
},
decode:function(token){
return this._urlBase2hex(token.substr(0,token.length/2))+this._urlBase2hex(token.substr(token.length/2,token.length/2));
},
_base:62,
_baseChars:"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
_urlBase2hex:function(token){
var s = 0, n, l = (n = token.split("")).length, i = 0;
while(l--) s += this._baseChars.indexOf(n[i++]) * Math.pow(this._base, l);
return s.toString(16);
},
_hex2urlBase:function(bson){
var s = "", n = parseInt(bson,16);
while(n) s = this._baseChars[n % this._base] + s, n = Math.floor(n / this._base);
return s;
}
}
テスト
//we have bson
var bson = '4f907f7e53a58f4313000028';
//let's encode it
var urlstring = bsonShortify.encode(bson) // = OqAYQdCHijCDMbRg
//let's decode urlstring
var decoded_bson = bsonShortify.decode(urlstring); // = 4f907f7e53a58f4313000028
console.log('bson',bson);
console.log('urlstring',urlstring);
console.log('decoded_bson',decoded_bson);