base64.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. exports = {
  2. encode: function(bytes) {
  3. var ret = [];
  4. var len = bytes.length;
  5. var remain = len % 3;
  6. len = len - remain;
  7. for (var i = 0; i < len; i += 3) {
  8. ret.push(
  9. numToBase64(
  10. (bytes[i] << 16) + (bytes[i + 1] << 8) + bytes[i + 2]
  11. )
  12. );
  13. }
  14. len = bytes.length;
  15. var tmp;
  16. if (remain === 1) {
  17. tmp = bytes[len - 1];
  18. ret.push(code[tmp >> 2]);
  19. ret.push(code[(tmp << 4) & 0x3f]);
  20. ret.push('==');
  21. } else if (remain === 2) {
  22. tmp = (bytes[len - 2] << 8) + bytes[len - 1];
  23. ret.push(code[tmp >> 10]);
  24. ret.push(code[(tmp >> 4) & 0x3f]);
  25. ret.push(code[(tmp << 2) & 0x3f]);
  26. ret.push('=');
  27. }
  28. return ret.join('');
  29. },
  30. decode: function(str) {
  31. var len = str.length,
  32. remain = 0;
  33. if (str[len - 2] === '=') remain = 2;
  34. else if (str[len - 1] === '=') remain = 1;
  35. var ret = new Array((len * 3) / 4 - remain);
  36. len = remain > 0 ? len - 4 : len;
  37. var i, j;
  38. for (i = 0, j = 0; i < len; i += 4) {
  39. var num = base64ToNum(str[i], str[i + 1], str[i + 2], str[i + 3]);
  40. ret[j++] = (num >> 16) & 0xff;
  41. ret[j++] = (num >> 8) & 0xff;
  42. ret[j++] = num & 0xff;
  43. }
  44. var tmp;
  45. if (remain === 2) {
  46. tmp =
  47. (codeMap[str.charCodeAt(i)] << 2) |
  48. (codeMap[str.charCodeAt(i + 1)] >> 4);
  49. ret[j++] = tmp & 0xff;
  50. } else if (remain === 1) {
  51. tmp =
  52. (codeMap[str.charCodeAt(i)] << 10) |
  53. (codeMap[str.charCodeAt(i + 1)] << 4) |
  54. (codeMap[str.charCodeAt(i + 2)] >> 2);
  55. ret[j++] = (tmp >> 8) & 0xff;
  56. ret[j++] = tmp & 0xff;
  57. }
  58. return ret;
  59. }
  60. };
  61. var codeMap = [];
  62. var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
  63. for (var i = 0, len = code.length; i < len; i++) {
  64. codeMap[code.charCodeAt(i)] = i;
  65. }
  66. function numToBase64(num) {
  67. return (
  68. code[(num >> 18) & 0x3f] +
  69. code[(num >> 12) & 0x3f] +
  70. code[(num >> 6) & 0x3f] +
  71. code[num & 0x3f]
  72. );
  73. }
  74. function base64ToNum(str1, str2, str3, str4) {
  75. return (
  76. (codeMap[str1.charCodeAt(0)] << 18) |
  77. (codeMap[str2.charCodeAt(0)] << 12) |
  78. (codeMap[str3.charCodeAt(0)] << 6) |
  79. codeMap[str4.charCodeAt(0)]
  80. );
  81. }
  82. module.exports = exports;