Created
August 14, 2014 19:44
-
-
Save gabrysiak/3dedf160fd2ee719c2b6 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function base64_encode(data) { | |
// example 1: base64_encode('Foo Bar'); | |
// returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA==' | |
// example 2: base64_encode('a'); | |
// returns 2: 'YQ==' | |
var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; | |
var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, | |
ac = 0, | |
enc = '', | |
tmp_arr = []; | |
if (!data) { | |
return data; | |
} | |
do { // pack three octets into four hexets | |
o1 = data.charCodeAt(i++); | |
o2 = data.charCodeAt(i++); | |
o3 = data.charCodeAt(i++); | |
bits = o1 << 16 | o2 << 8 | o3; | |
h1 = bits >> 18 & 0x3f; | |
h2 = bits >> 12 & 0x3f; | |
h3 = bits >> 6 & 0x3f; | |
h4 = bits & 0x3f; | |
// use hexets to index into b64, and append result to encoded string | |
tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4); | |
} while (i < data.length); | |
enc = tmp_arr.join(''); | |
var r = data.length % 3; | |
return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3); | |
} | |
function base64_decode(data) { | |
// example 1: base64_decode('S2V2aW4gdmFuIFpvbm5ldmVsZA=='); | |
// returns 1: 'Foo Bar' | |
// example 2: base64_decode('YQ==='); | |
// returns 2: 'a' | |
var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; | |
var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, | |
ac = 0, | |
dec = '', | |
tmp_arr = []; | |
if (!data) { | |
return data; | |
} | |
data += ''; | |
do { // unpack four hexets into three octets using index points in b64 | |
h1 = b64.indexOf(data.charAt(i++)); | |
h2 = b64.indexOf(data.charAt(i++)); | |
h3 = b64.indexOf(data.charAt(i++)); | |
h4 = b64.indexOf(data.charAt(i++)); | |
bits = h1 << 18 | h2 << 12 | h3 << 6 | h4; | |
o1 = bits >> 16 & 0xff; | |
o2 = bits >> 8 & 0xff; | |
o3 = bits & 0xff; | |
if (h3 == 64) { | |
tmp_arr[ac++] = String.fromCharCode(o1); | |
} else if (h4 == 64) { | |
tmp_arr[ac++] = String.fromCharCode(o1, o2); | |
} else { | |
tmp_arr[ac++] = String.fromCharCode(o1, o2, o3); | |
} | |
} while (i < data.length); | |
dec = tmp_arr.join(''); | |
return dec.replace(/\0+$/, ''); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment