base64.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /**
  2. *
  3. * Base64 encode / decode
  4. *
  5. * @author haitao.tu
  6. * @date 2010-04-26
  7. * @email tuhaitao@foxmail.com
  8. *
  9. */
  10. export default class Base64 {
  11. private static instance: Base64 = null
  12. static get Instance(): Base64 {
  13. if (!this.instance) {
  14. this.instance = new Base64()
  15. }
  16. return this.instance
  17. }
  18. // private property
  19. _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  20. // public method for encoding
  21. encode(inputw) {
  22. var output = "";
  23. var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
  24. var i = 0;
  25. var input = this._utf8_encode(inputw);
  26. while (i < input.length) {
  27. chr1 = input.charCodeAt(i++);
  28. chr2 = input.charCodeAt(i++);
  29. chr3 = input.charCodeAt(i++);
  30. enc1 = chr1 >> 2;
  31. enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
  32. enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
  33. enc4 = chr3 & 63;
  34. if (isNaN(chr2)) {
  35. enc3 = enc4 = 64;
  36. } else if (isNaN(chr3)) {
  37. enc4 = 64;
  38. }
  39. output = output +
  40. this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
  41. this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
  42. }
  43. return output;
  44. }
  45. // public method for decoding
  46. decode(inputw) {
  47. var output = "";
  48. var chr1, chr2, chr3;
  49. var enc1, enc2, enc3, enc4;
  50. var i = 0;
  51. var input = inputw.replace(/[^A-Za-z0-9\+\/\=]/g, "");
  52. while (i < input.length) {
  53. enc1 = this._keyStr.indexOf(input.charAt(i++));
  54. enc2 = this._keyStr.indexOf(input.charAt(i++));
  55. enc3 = this._keyStr.indexOf(input.charAt(i++));
  56. enc4 = this._keyStr.indexOf(input.charAt(i++));
  57. chr1 = (enc1 << 2) | (enc2 >> 4);
  58. chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
  59. chr3 = ((enc3 & 3) << 6) | enc4;
  60. output = output + String.fromCharCode(chr1);
  61. if (enc3 != 64) {
  62. output = output + String.fromCharCode(chr2);
  63. }
  64. if (enc4 != 64) {
  65. output = output + String.fromCharCode(chr3);
  66. }
  67. }
  68. output = this._utf8_decode(output);
  69. return output;
  70. }
  71. // private method for UTF-8 encoding
  72. _utf8_encode = function (string) {
  73. string = string.replace(/\r\n/g, "\n");
  74. var utftext = "";
  75. for (var n = 0; n < string.length; n++) {
  76. var c = string.charCodeAt(n);
  77. if (c < 128) {
  78. utftext += String.fromCharCode(c);
  79. } else if ((c > 127) && (c < 2048)) {
  80. utftext += String.fromCharCode((c >> 6) | 192);
  81. utftext += String.fromCharCode((c & 63) | 128);
  82. } else {
  83. utftext += String.fromCharCode((c >> 12) | 224);
  84. utftext += String.fromCharCode(((c >> 6) & 63) | 128);
  85. utftext += String.fromCharCode((c & 63) | 128);
  86. }
  87. }
  88. return utftext;
  89. }
  90. // private method for UTF-8 decoding
  91. _utf8_decode = function (utftext) {
  92. var string = "";
  93. var i = 0;
  94. var c = 0;
  95. var c1 = 0;
  96. var c2 = 0;
  97. var c3 = 0;
  98. while (i < utftext.length) {
  99. c = utftext.charCodeAt(i);
  100. if (c < 128) {
  101. string += String.fromCharCode(c);
  102. i++;
  103. } else if ((c > 191) && (c < 224)) {
  104. c2 = utftext.charCodeAt(i + 1);
  105. string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
  106. i += 2;
  107. } else {
  108. c2 = utftext.charCodeAt(i + 1);
  109. c3 = utftext.charCodeAt(i + 2);
  110. string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
  111. i += 3;
  112. }
  113. }
  114. return string;
  115. }
  116. }