no tengo Firefox a mano, así que no puedo probarlo, pero desde una perspectiva general de manejo de series que parece que tiene algo de espacio mejorar. Lo que estás haciendo es, por cada byte, crear una nueva cadena de un carácter más larga que la anterior. Esta es una operación O (N^2). Hay algunas maneras de reducir N para que su algoritmo se ejecuta en casi lineal tiempo:
Build hasta cadenas a la longitud 57 (esto va a dar un resultado 76-char base 64), a continuación, realizar una btoa
en y añada la cadena resultante a su resultado
Al igual que en el n. ° 1, solo cree un conjunto de líneas y llame al join
para crear la cadena final de salida.
Utilice map
para crear una matriz de cadenas de 1 carácter, luego llame al join
en él.
Aquí hay un código no probado para cada método:
function encode(data)
{
var output = "";
var str = "";
for (var i = 0; i < data.length; i++)
{
str += String.fromCharCode(data[i]);
// the "&& i != data.length - 1" clause
// keeps the extra \n off the end of the output
// when the last line is exactly 76 characters
if (str.length == 57 && i != data.length - 1)
{
output += btoa(str) + "\n";
str = "";
}
}
return output + btoa(str);
}
function encode(data)
{
var output = [];
var str = "";
for (var i = 0; i < data.length; i++)
{
str += String.fromCharCode(data[i]);
if (str.length == 57)
{
output[output.length] = btoa(str);
str = "";
}
}
if (str != "")
output[output.length] = btoa(str);
return output.join("\n");
}
function encode(data)
{
var str = data.map(function (d) { return String.fromCharCode(d) }).join("");
return btoa(str).replace(/.{76}(?=.)/g,'$&\n');
}
Y aquí es la última, minified (116 caracteres):
function e(b){return btoa(b.map(function(d){return
String.fromCharCode(d)}).join("")).replace(/.{76}(?=.)/g,'$&\n')}
corre más rápido en el navegador (s)? 'btoa' solo es compatible con los navegadores Gecko y WebKit hasta donde yo sé. – Gabe
Da la casualidad que se trata de una pieza muy pequeña de una extensión de Firefox, pero si tienes una forma inteligente de hacerlo utilizando el JS de otros navegadores, me alegra ver eso también. – zwol
ahem ... http://codegolf.stackexchange.com/ – jessegavin