Convert Array Of Byte Values To Base64 Encoded String And Break Long Lines, Javascript (code Golf)
Solution 1:
I have another entry:
functionencode(data)
{
var str = String.fromCharCode.apply(null,data);
returnbtoa(str).replace(/.{76}(?=.)/g,'$&\n');
}
Minified, 88 characters:
functione(d){returnbtoa(String.fromCharCode.apply(d,d)).replace(/.{76}(?=.)/g,'$&\n')}
Or if you want trailing newlines, 85 characters:
functione(d){returnbtoa(String.fromCharCode.apply(d,d)).replace(/.{1,76}/g,'$&\n')}
Solution 2:
Works in Firefox 3.6.13:
functionencode(data)
{
var str = data.reduce(function(a,b){ return a+String.fromCharCode(b) },'');
returnbtoa(str).replace(/.{76}(?=.)/g,'$&\n');
}
Solution 3:
I don't have Firefox handy, so I can't try it out, but from a general string-handling perspective it looks like you have some room to improve. What you're doing is, for every byte, creating a new string one character longer than your previous one. This is an O(N^2) operation. There are a few ways to cut down N so that your algorithm runs in near-linear time:
Build up strings to length 57 (this will yield a 76-char Base64 result), then perform a
btoa
on it and add the resulting string to your outputJust like #1, only build an array of lines and call
join
on it to create the final output string.Use
map
to create an array of 1-character strings, then calljoin
on it.
Here's some untested code for each method:
functionencode(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 charactersif (str.length == 57 && i != data.length - 1)
{
output += btoa(str) + "\n";
str = "";
}
}
return output + btoa(str);
}
functionencode(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");
}
functionencode(data)
{
var str = data.map(function (d) { returnString.fromCharCode(d) }).join("");
returnbtoa(str).replace(/.{76}(?=.)/g,'$&\n');
}
And here's the last one, minified (116 chars):
functione(b){returnbtoa(b.map(function(d){returnString.fromCharCode(d)}).join("")).replace(/.{76}(?=.)/g,'$&\n')}
Post a Comment for "Convert Array Of Byte Values To Base64 Encoded String And Break Long Lines, Javascript (code Golf)"