base64.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. /* eslint-disable */
  2. export function utf8Encode(argString) {
  3. // http://kevin.vanzonneveld.net
  4. // + original by: Webtoolkit.info (http://www.webtoolkit.info/)
  5. // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  6. // + improved by: sowberry
  7. // + tweaked by: Jack
  8. // + bugfixed by: Onno Marsman
  9. // + improved by: Yves Sucaet
  10. // + bugfixed by: Onno Marsman
  11. // + bugfixed by: Ulrich
  12. // + bugfixed by: Rafal Kukawski
  13. // + improved by: kirilloid
  14. // + bugfixed by: kirilloid
  15. // * example 1: this.utf8Encode('Kevin van Zonneveld')
  16. // * returns 1: 'Kevin van Zonneveld'
  17. if (argString === null || typeof argString === 'undefined') {
  18. return '';
  19. }
  20. var string = argString + ''; // .replace(/\r\n/g, '\n').replace(/\r/g, '\n')
  21. var utftext = '', start, end, stringl = 0;
  22. start = end = 0;
  23. stringl = string.length;
  24. for (var n = 0; n < stringl; n++) {
  25. var c1 = string.charCodeAt(n);
  26. var enc = null;
  27. if (c1 < 128) {
  28. end++;
  29. }
  30. else if (c1 > 127 && c1 < 2048) {
  31. enc = String.fromCharCode((c1 >> 6) | 192, (c1 & 63) | 128);
  32. }
  33. else if ((c1 & 0xf800 ^ 0xd800) > 0) {
  34. enc = String.fromCharCode((c1 >> 12) | 224, ((c1 >> 6) & 63) | 128, (c1 & 63) | 128);
  35. }
  36. else {
  37. // surrogate pairs
  38. if ((c1 & 0xfc00 ^ 0xd800) > 0) {
  39. throw new RangeError('Unmatched trail surrogate at ' + n);
  40. }
  41. var c2 = string.charCodeAt(++n);
  42. if ((c2 & 0xfc00 ^ 0xdc00) > 0) {
  43. throw new RangeError('Unmatched lead surrogate at ' + (n - 1));
  44. }
  45. c1 = ((c1 & 0x3ff) << 10) + (c2 & 0x3ff) + 0x10000;
  46. enc = String.fromCharCode((c1 >> 18) | 240, ((c1 >> 12) & 63) | 128, ((c1 >> 6) & 63) | 128, (c1 & 63) | 128);
  47. }
  48. if (enc !== null) {
  49. if (end > start) {
  50. utftext += string.slice(start, end);
  51. }
  52. utftext += enc;
  53. start = end = n + 1;
  54. }
  55. }
  56. if (end > start) {
  57. utftext += string.slice(start, stringl);
  58. }
  59. return utftext;
  60. }
  61. export function base64Encode(data) {
  62. // http://kevin.vanzonneveld.net
  63. // + original by: Tyler Akins (http://rumkin.com)
  64. // + improved by: Bayron Guevara
  65. // + improved by: Thunder.m
  66. // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  67. // + bugfixed by: Pellentesque Malesuada
  68. // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  69. // - depends on: this.utf8Encode
  70. // * example 1: this.base64Encode('Kevin van Zonneveld')
  71. // * returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA=='
  72. // mozilla has this native
  73. // - but breaks in 2.0.0.12!
  74. // if (typeof this.window['atob'] == 'function') {
  75. // return atob(data)
  76. // }
  77. var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
  78. var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, enc = '', tmp_arr = [];
  79. if (!data) {
  80. return data;
  81. }
  82. data = utf8Encode(data + '');
  83. do {
  84. // pack three octets into four hexets
  85. o1 = data.charCodeAt(i++);
  86. o2 = data.charCodeAt(i++);
  87. o3 = data.charCodeAt(i++);
  88. bits = (o1 << 16) | (o2 << 8) | o3;
  89. h1 = (bits >> 18) & 0x3f;
  90. h2 = (bits >> 12) & 0x3f;
  91. h3 = (bits >> 6) & 0x3f;
  92. h4 = bits & 0x3f;
  93. // use hexets to index into b64, and append result to encoded string
  94. tmp_arr[ac++] =
  95. b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
  96. } while (i < data.length);
  97. enc = tmp_arr.join('');
  98. switch (data.length % 3) {
  99. case 1:
  100. enc = enc.slice(0, -2) + '==';
  101. break;
  102. case 2:
  103. enc = enc.slice(0, -1) + '=';
  104. break;
  105. }
  106. return enc;
  107. }
  108. export function base64Decode(data) {
  109. // http://kevin.vanzonneveld.net
  110. // + original by: Tyler Akins (http://rumkin.com)
  111. // + improved by: Thunder.m
  112. // + input by: Aman Gupta
  113. // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  114. // + bugfixed by: Onno Marsman
  115. // + bugfixed by: Pellentesque Malesuada
  116. // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  117. // + input by: Brett Zamir (http://brett-zamir.me)
  118. // + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  119. // * example 1: base64_decode('S2V2aW4gdmFuIFpvbm5ldmVsZA==')
  120. // * returns 1: 'Kevin van Zonneveld'
  121. // mozilla has this native
  122. // - but breaks in 2.0.0.12!
  123. // if (typeof this.window['atob'] == 'function') {
  124. // return atob(data)
  125. // }
  126. var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
  127. var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, dec = '', tmp_arr = [];
  128. if (!data) {
  129. return data;
  130. }
  131. data += '';
  132. do { // unpack four hexets into three octets using index points in b64
  133. h1 = b64.indexOf(data.charAt(i++));
  134. h2 = b64.indexOf(data.charAt(i++));
  135. h3 = b64.indexOf(data.charAt(i++));
  136. h4 = b64.indexOf(data.charAt(i++));
  137. bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
  138. o1 = bits >> 16 & 0xff;
  139. o2 = bits >> 8 & 0xff;
  140. o3 = bits & 0xff;
  141. if (h3 === 64) {
  142. tmp_arr[ac++] = String.fromCharCode(o1);
  143. }
  144. else if (h4 === 64) {
  145. tmp_arr[ac++] = String.fromCharCode(o1, o2);
  146. }
  147. else {
  148. tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);
  149. }
  150. } while (i < data.length);
  151. dec = tmp_arr.join('');
  152. return dec;
  153. }
  154. export function urlSafeBase64Encode(v) {
  155. v = base64Encode(v);
  156. return v.replace(/\//g, '_').replace(/\+/g, '-');
  157. }
  158. export function urlSafeBase64Decode(v) {
  159. v = v.replace(/_/g, '/').replace(/-/g, '+');
  160. return base64Decode(v);
  161. }
  162. //# sourceMappingURL=base64.js.map