base64.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. /*
  2. * $Id: base64.js,v 1.2 2011/12/27 14:34:49 dankogai Exp dankogai $
  3. *
  4. * Licensed under the MIT license.
  5. * http://www.opensource.org/licenses/mit-license.php
  6. *
  7. */
  8. (function(global){
  9. if (global.Base64) return;
  10. var b64chars
  11. = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
  12. var b64tab = function(bin){
  13. var t = {};
  14. for (var i = 0, l = bin.length; i < l; i++) t[bin.charAt(i)] = i;
  15. return t;
  16. }(b64chars);
  17. var sub_toBase64 = function(m){
  18. var n = (m.charCodeAt(0) << 16)
  19. | (m.charCodeAt(1) << 8)
  20. | (m.charCodeAt(2) );
  21. return b64chars.charAt( n >>> 18)
  22. + b64chars.charAt((n >>> 12) & 63)
  23. + b64chars.charAt((n >>> 6) & 63)
  24. + b64chars.charAt( n & 63);
  25. };
  26. var toBase64 = function(bin){
  27. if (bin.match(/[^\x00-\xFF]/)) throw 'unsupported character found' ;
  28. var padlen = 0;
  29. while(bin.length % 3) {
  30. bin += '\0';
  31. padlen++;
  32. };
  33. var b64 = bin.replace(/[\x00-\xFF]{3}/g, sub_toBase64);
  34. if (!padlen) return b64;
  35. b64 = b64.substr(0, b64.length - padlen);
  36. while(padlen--) b64 += '=';
  37. return b64;
  38. };
  39. var btoa = global.btoa || toBase64;
  40. var sub_fromBase64 = function(m){
  41. var n = (b64tab[ m.charAt(0) ] << 18)
  42. | (b64tab[ m.charAt(1) ] << 12)
  43. | (b64tab[ m.charAt(2) ] << 6)
  44. | (b64tab[ m.charAt(3) ]);
  45. return String.fromCharCode( n >> 16 )
  46. + String.fromCharCode( (n >> 8) & 0xff )
  47. + String.fromCharCode( n & 0xff );
  48. };
  49. var fromBase64 = function(b64){
  50. b64 = b64.replace(/[^A-Za-z0-9\+\/]/g, '');
  51. var padlen = 0;
  52. while(b64.length % 4){
  53. b64 += 'A';
  54. padlen++;
  55. }
  56. var bin = b64.replace(/[A-Za-z0-9\+\/]{4}/g, sub_fromBase64);
  57. if (padlen >= 2)
  58. bin = bin.substring(0, bin.length - [0,0,2,1][padlen]);
  59. return bin;
  60. };
  61. var atob = global.atob || fromBase64;
  62. var re_char_nonascii = /[^\x00-\x7F]/g;
  63. var sub_char_nonascii = function(m){
  64. var n = m.charCodeAt(0);
  65. return n < 0x800 ? String.fromCharCode(0xc0 | (n >>> 6))
  66. + String.fromCharCode(0x80 | (n & 0x3f))
  67. : String.fromCharCode(0xe0 | ((n >>> 12) & 0x0f))
  68. + String.fromCharCode(0x80 | ((n >>> 6) & 0x3f))
  69. + String.fromCharCode(0x80 | (n & 0x3f))
  70. ;
  71. };
  72. var utob = function(uni){
  73. return uni.replace(re_char_nonascii, sub_char_nonascii);
  74. };
  75. var re_bytes_nonascii
  76. = /[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g;
  77. var sub_bytes_nonascii = function(m){
  78. var c0 = m.charCodeAt(0);
  79. var c1 = m.charCodeAt(1);
  80. if(c0 < 0xe0){
  81. return String.fromCharCode(((c0 & 0x1f) << 6) | (c1 & 0x3f));
  82. }else{
  83. var c2 = m.charCodeAt(2);
  84. return String.fromCharCode(
  85. ((c0 & 0x0f) << 12) | ((c1 & 0x3f) << 6) | (c2 & 0x3f)
  86. );
  87. }
  88. };
  89. var btou = function(bin){
  90. return bin.replace(re_bytes_nonascii, sub_bytes_nonascii);
  91. };
  92. global.Base64 = {
  93. fromBase64:fromBase64,
  94. toBase64:toBase64,
  95. atob:atob,
  96. btoa:btoa,
  97. utob:utob,
  98. btou:btou,
  99. encode:function(u){ return btoa(utob(u)) },
  100. encodeURI:function(u){
  101. return btoa(utob(u)).replace(/[+\/]/g, function(m0){
  102. return m0 == '+' ? '-' : '_';
  103. }).replace(/=+$/, '');
  104. },
  105. decode:function(a){
  106. return btou(atob(a.replace(/[-_]/g, function(m0){
  107. return m0 == '-' ? '+' : '/';
  108. })));
  109. }
  110. };
  111. })(this);