atob.js 1.2 KB

12345678910111213141516171819202122232425
  1. var b64re = /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/;
  2. var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  3. module.exports = function(string) {
  4. // atob can work with strings with whitespaces, even inside the encoded part,
  5. // but only \t, \n, \f, \r and ' ', which can be stripped.
  6. string = String(string).replace(/[\t\n\f\r ]+/g, "");
  7. if (!b64re.test(string))
  8. throw new TypeError("Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.");
  9. // Adding the padding if missing, for semplicity
  10. string += "==".slice(2 - (string.length & 3));
  11. var bitmap, result = "",
  12. r1, r2, i = 0;
  13. for (; i < string.length;) {
  14. bitmap = b64.indexOf(string.charAt(i++)) << 18 | b64.indexOf(string.charAt(i++)) << 12 |
  15. (r1 = b64.indexOf(string.charAt(i++))) << 6 | (r2 = b64.indexOf(string.charAt(i++)));
  16. result += r1 === 64 ? String.fromCharCode(bitmap >> 16 & 255) :
  17. r2 === 64 ? String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255) :
  18. String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255, bitmap & 255);
  19. }
  20. return result;
  21. };