Base64 кодированный BSON меньше, чем BSON? - PullRequest
2 голосов
/ 19 апреля 2010

BSON с кодировкой Base64 меньше BSON?

Ответы [ 3 ]

9 голосов
/ 19 апреля 2010

Право Писквора в кодировке base64 - все длиннее, чем raw. Вы кодируете что-то с помощью base64, чтобы получить его по каналу с ограниченным набором символов, а не как средство уменьшения размера.

Возможно, вопрос должен звучать так: BSON в кодировке Base64 меньше JSON ?

Если это так, то JSON-vs-BSON очень сильно зависит от содержимого. Например, произвольные числа с плавающей запятой, такие как 1.2345678901234567, более эффективно хранятся в 8 двоичных байтах в BSON, чем версия строковых цифр JSON. Но более распространенные числа, такие как, скажем, 1, гораздо эффективнее хранятся в виде строк в JSON.

Для строковых значений BSON теряет 4 байта для длинного слова, но возвращает некоторые обратно для каждых " и \ JSON должен быть экранирован, плюс еще в строках с управляющими символами, где JSON должен использовать шестнадцатеричную последовательность. (Некоторые JSON-кодеры также \u -экранируют каждый не-ASCII-символ для обеспечения безопасной передачи независимо от набора символов.)

IMO: BSON не имеет большого преимущества в компактности перед JSON в целом. Его сила заключается в простоте декодирования на низкоуровневом языке, а также в типах данных, которые JavaScript не имеет. Это может иметь незначительные преимущества для двоичных строк и нескольких других случаев; это, безусловно, стоит проверить для конкретной рабочей нагрузки. Но это говорит о том, что примеры в самой спецификации BSON значительно меньше в JSON.

Что касается BSON в кодировке base64: то же самое, за исключением 33%.

6 голосов
/ 19 апреля 2010

Нет: с base64 3 байта открытого текста становятся 4 байтами кодированного текста, поэтому результат всегда будет больше, независимо от того, какова полезная нагрузка данных. Смотрите также: http://en.wikipedia.org/wiki/Base64

0 голосов
/ 21 апреля 2012

только что написал это как мое решение сократить 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;
  } 
}

TEST

//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);
...