-
-
Save jhurliman/1250118 to your computer and use it in GitHub Desktop.
/* | |
* base64.js: An extremely simple implementation of base64 encoding / decoding using node.js Buffers | |
* | |
* (C) 2010, Nodejitsu Inc. | |
* (C) 2011, Cull TV, Inc. | |
* | |
*/ | |
var base64 = exports; | |
base64.encode = function(unencoded) { | |
return new Buffer(unencoded || '').toString('base64'); | |
}; | |
base64.decode = function(encoded) { | |
return new Buffer(encoded || '', 'base64').toString('utf8'); | |
}; | |
base64.urlEncode = function(unencoded) { | |
var encoded = base64.encode(unencoded); | |
return encoded.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''); | |
}; | |
base64.urlDecode = function(encoded) { | |
encoded = encoded.replace(/-/g, '+').replace(/_/g, '/'); | |
while (encoded.length % 4) | |
encoded += '='; | |
return base64.decode(encoded); | |
}; |
Thank you for saving me time and allowing me to have one less npm package dependency.
These are incorrect, as using string patterns in .replace()
will only replace the first instance; instead you need to use regex with the g
flag:
encoded.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
Your line is also incorrect, as you missed the "g" for the last two replacements :)
encoded.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/g, '');
I don't know that it's needed for the last one as the +
is greedy, but it shoudln't hurt
Thanks @netzmensch, encoded.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/g, '');
seems to work nicely.
The 'g' replacing '=' is not needed, the are equals only at the end of the string. But really useful implementation :)
Thanks @netzmensch,
encoded.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/g, '');
seems to work nicely.
is work.
The decode function is also missing global "-" and "_" replacement.
Line 25 should be: encoded = encoded.replace(/-/g, '+').replace(/_/g, '/');
.
Humans can I present the following for your critique.
I offer this as the replace function
'e8/51e2fa+4f/00+4609+9d/d2+9b3794c/59619====='.replace(/(\+)|(\/)|(=+$)/g,(match) => Object.create({'+': '-', '/': '_', '=': ''})[match[0]])
outputs e8_51e2fa-4f_00-4609-9d_d2-9b3794c_59619
@Rudiger86 nice! might be faster since it only walks through the string once.
I think I got it slightly simplified to:
'e8/51e2fa+4f/00+4609+9d/d2+9b3794c/59619====='.replace(/[+/=]/g, match =>
({'+': '-', '/': '_', '=': ''}[match])
)
This is slightly less robust because I replace every =
, but hey, in normal base64 strings =
es should only ever be at the end anyway.
thanks :)
For ASCII only use cases:
function encode(textToEncode) {
return btoa(textToEncode).replace(/\+/g, '~').replace(/\//g, '_').replace(/=/g, '-');
}
function decode(textToDecode: string): string {
return atob(textToDecode.replace(/~/g, '+').replace(/_/g, '/').replace(/-/g, '='));
}
nice work.