public
Last active — forked from 140bytes/LICENSE.txt

base64 encoder w/padding

  • Download Gist
LICENSE.txt
1 2 3 4 5 6 7 8 9 10 11 12 13
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004
 
Copyright (C) 2011 YOUR_NAME_HERE <YOUR_URL_HERE>
 
Everyone is permitted to copy and distribute verbatim or modified
copies of this license document, and changing it is allowed as long
as the name is changed.
 
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 
0. You just DO WHAT THE FUCK YOU WANT TO.
README.md
Markdown

140byt.es - Base64 encoder

A base64encoder with padding, what shall i say more? This version now includes the amazing improvements made by Jonas Magazinius and LeverOne, for more details visit the "sla.ckers"-forum @ http://sla.ckers.org/forum/read.php?24,36342

Example

var 
    sigma ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
,   sample = "140bytes rocks!"
,   encoded = (function(...){...})(sample, sigma);
annotated.js
JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
function(
a, /* input text */
b, /* mapping table */
c, /* working block */
d, /* input char index */
e /* output text */ ){
 
for(
// initialize char indices
d=e='';
// cast d to int (floor)
// if the next input index does not exist:
// change the mapping table to "="
// check if d has no fractional digits
a[d|0]||(b='=',d%1);
 
e+=b[ 63 & c >> 8 - d % 1 * 8 ] // "8 - d % 1 * 8" generates the sequence 2, 4, 6, 8 (first value for d is 0.75)
 
)c = c << 8 | a.charCodeAt( d-=-.75 ); // note: "d -= -3/4" works too
 
return e
}
index.js
JavaScript
1
function(a,b,c,d,e){for(d=e='';a[d|0]||(b='=',d%1);e+=b[63&c>>8-d%1*8])c=c<<8|a.charCodeAt(d-=-.75);return e}
package.json
JSON
1 2 3 4 5
{
"name": "Base64Encoder",
"description": "A JavaScript Base64 encoder in 109 Bytes.",
"keywords": ["base64", "encode", "rfc2045", "sla.ckers", "btoa"]
}
test.html
HTML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
<html>
<body>
<script type="text/javascript">
 
(function(){
 
var f = function(a,b,c,d,e){for(d=e='';a[d|0]||(b='=',d%1);e+=b[63&c>>8-d%1*8])c=c<<8|a.charCodeAt(d-=-.75);return e}
 
, test = {
'' : ''
,'AA==' : '\0'
,'AAA=' : '\0\0'
,'AAAA' : '\0\0\0'
,'AAEC' : '\0\1\2'
,"Zg==" : "f"
,"Zm8=" : "fo"
,"Zm9v" : "foo"
,"Zm9vYg==" : "foob"
,"Zm9vYmE=" : "fooba"
,"Zm9vYmFy" : "foobar"
}
, error = 0;
;
 
for( i in test ) {
var r = f(test[i], "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", "=");
if( r != i ) {
error++;
document.writeln( 'Expected &quot;'+i+'&quot; for &quot;'+test[i]+'&quot; but got &quot;'+ r + "&quot;<br>" );
}
}
 
if( error > 0) {
document.writeln( "<br>"+error+ " tests failed!<br>" );
} else {
document.writeln( "<br>Everything is fine!<br>" );
}
 
})();
 
 
</script>
</body>
</html>

ris not declared and spills the global scope. Since you do have enough chars left that should be no problem though.

this is still blowing my mind.

This will not work in IE7 and older versions. Since only few people are using this old browser replacements, I would not consider this critical.

hey @nignag, would you mind taking the comments out of your package.json?

Any idea what I should change to make it work for IE7 and older ? In my company everyone is using IE<=9 BUT with IE7 compatibility mode (blocked by I/T), and this code doesn't work in that case :-/
Thanks.

try chaning the bracket notation on line 16 and 18 to .charAt(). otherwise sneak up to your co-workers stations and install chromeframe. :)

@Kambfhase yes it works like that. Thanks!

wait, did .charAt work or did sneaking up on your coworkers work? nyuk.

you could also use .split('') on both input string and translation map.

@LeverOne: (d-=-.75) looks like it can be reduced to (d+=.75)

@atk
Unfortunately, not. This is a trick to prevent the concatenation, since d is a string initially. Therefore, d+=.75 == '.75', then '.75.75', etc.

@LeverOne: thanks for clarification.

@LeverOne: I always wonder how you find so many magic sequences. Could you tell us how?

@tsaniel
This process is almost creative, there are no special spells.

Could you please explain me what this "d%1" in "a[d|0]||(b='=',d%1);". Why don't just "a[d|0]||b='=';"?

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.