|
@@ -0,0 +1,179 @@
|
|
|
+
|
|
|
+ var _PADCHAR = "=",
|
|
|
+ _ALPHA = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
|
|
|
+ _VERSION = "1.1";//Mr. Ruan fix to 1.1 to support asian char(utf8)
|
|
|
+
|
|
|
+
|
|
|
+ function _getbyte64(s, i) {
|
|
|
+ // This is oddly fast, except on Chrome/V8.
|
|
|
+ // Minimal or no improvement in performance by using a
|
|
|
+ // object with properties mapping chars to value (eg. 'A': 0)
|
|
|
+
|
|
|
+ var idx = _ALPHA.indexOf(s.charAt(i));
|
|
|
+
|
|
|
+ if (idx === -1) {
|
|
|
+ throw "Cannot decode base64";
|
|
|
+ }
|
|
|
+
|
|
|
+ return idx;
|
|
|
+ }
|
|
|
+
|
|
|
+ function _decode_chars(y, x) {
|
|
|
+ while (y.length > 0) {
|
|
|
+ var ch = y[0];
|
|
|
+ if (ch < 0x80) {
|
|
|
+ y.shift();
|
|
|
+ x.push(String.fromCharCode(ch));
|
|
|
+ } else if ((ch & 0x80) == 0xc0) {
|
|
|
+ if (y.length < 2) break;
|
|
|
+ ch = y.shift();
|
|
|
+ var ch1 = y.shift();
|
|
|
+ x.push(String.fromCharCode(((ch & 0x1f) << 6) + (ch1 & 0x3f)));
|
|
|
+ } else {
|
|
|
+ if (y.length < 3) break;
|
|
|
+ ch = y.shift();
|
|
|
+ var ch1 = y.shift();
|
|
|
+ var ch2 = y.shift();
|
|
|
+ x.push(String.fromCharCode(((ch & 0x0f) << 12) + ((ch1 & 0x3f) << 6) + (ch2 & 0x3f)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function _decode(s) {
|
|
|
+ var pads = 0,
|
|
|
+ i,
|
|
|
+ b10,
|
|
|
+ imax = s.length,
|
|
|
+ x = [],
|
|
|
+ y = [];
|
|
|
+
|
|
|
+ s = String(s);
|
|
|
+
|
|
|
+ if (imax === 0) {
|
|
|
+ return s;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (imax % 4 !== 0) {
|
|
|
+ throw "Cannot decode base64";
|
|
|
+ }
|
|
|
+
|
|
|
+ if (s.charAt(imax - 1) === _PADCHAR) {
|
|
|
+ pads = 1;
|
|
|
+
|
|
|
+ if (s.charAt(imax - 2) === _PADCHAR) {
|
|
|
+ pads = 2;
|
|
|
+ }
|
|
|
+
|
|
|
+ // either way, we want to ignore this last block
|
|
|
+ imax -= 4;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (i = 0; i < imax; i += 4) {
|
|
|
+ var ch1 = _getbyte64(s, i);
|
|
|
+ var ch2 = _getbyte64(s, i + 1);
|
|
|
+ var ch3 = _getbyte64(s, i + 2);
|
|
|
+ var ch4 = _getbyte64(s, i + 3);
|
|
|
+
|
|
|
+ b10 = (_getbyte64(s, i) << 18) | (_getbyte64(s, i + 1) << 12) | (_getbyte64(s, i + 2) << 6) | _getbyte64(s, i + 3);
|
|
|
+ y.push(b10 >> 16);
|
|
|
+ y.push((b10 >> 8) & 0xff);
|
|
|
+ y.push(b10 & 0xff);
|
|
|
+ _decode_chars(y, x);
|
|
|
+ }
|
|
|
+ switch (pads) {
|
|
|
+ case 1:
|
|
|
+ b10 = (_getbyte64(s, i) << 18) | (_getbyte64(s, i + 1) << 12) | (_getbyte64(s, i + 2) << 6);
|
|
|
+ y.push(b10 >> 16);
|
|
|
+ y.push((b10 >> 8) & 0xff);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 2:
|
|
|
+ b10 = (_getbyte64(s, i) << 18) | (_getbyte64(s, i + 1) << 12);
|
|
|
+ y.push(b10 >> 16);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ _decode_chars(y, x);
|
|
|
+ if (y.length > 0) throw "Cannot decode base64";
|
|
|
+ return x.join("");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ function _get_chars(ch, y) {
|
|
|
+ if (ch < 0x80) y.push(ch);
|
|
|
+ else if (ch < 0x800) {
|
|
|
+ y.push(0xc0 + ((ch >> 6) & 0x1f));
|
|
|
+ y.push(0x80 + (ch & 0x3f));
|
|
|
+ } else {
|
|
|
+ y.push(0xe0 + ((ch >> 12) & 0xf));
|
|
|
+ y.push(0x80 + ((ch >> 6) & 0x3f));
|
|
|
+ y.push(0x80 + (ch & 0x3f));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ function _encode(s) {
|
|
|
+ if (arguments.length !== 1) {
|
|
|
+ throw "SyntaxError: exactly one argument required";
|
|
|
+ }
|
|
|
+
|
|
|
+ s = String(s);
|
|
|
+ if (s.length === 0) {
|
|
|
+ return s;
|
|
|
+ }
|
|
|
+
|
|
|
+ //s = _encode_utf8(s);
|
|
|
+ var i,
|
|
|
+ b10,
|
|
|
+ y = [],
|
|
|
+ x = [],
|
|
|
+ len = s.length;
|
|
|
+ i = 0;
|
|
|
+ while (i < len) {
|
|
|
+ _get_chars(s.charCodeAt(i), y);
|
|
|
+ while (y.length >= 3) {
|
|
|
+ var ch1 = y.shift();
|
|
|
+ var ch2 = y.shift();
|
|
|
+ var ch3 = y.shift();
|
|
|
+ b10 = (ch1 << 16) | (ch2 << 8) | ch3;
|
|
|
+ x.push(_ALPHA.charAt(b10 >> 18));
|
|
|
+ x.push(_ALPHA.charAt((b10 >> 12) & 0x3F));
|
|
|
+ x.push(_ALPHA.charAt((b10 >> 6) & 0x3f));
|
|
|
+ x.push(_ALPHA.charAt(b10 & 0x3f));
|
|
|
+ }
|
|
|
+ i++;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ switch (y.length) {
|
|
|
+ case 1:
|
|
|
+ var ch = y.shift();
|
|
|
+ b10 = ch << 16;
|
|
|
+ x.push(_ALPHA.charAt(b10 >> 18) + _ALPHA.charAt((b10 >> 12) & 0x3F) + _PADCHAR + _PADCHAR);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 2:
|
|
|
+ var ch1 = y.shift();
|
|
|
+ var ch2 = y.shift();
|
|
|
+ b10 = (ch1 << 16) | (ch2 << 8);
|
|
|
+ x.push(_ALPHA.charAt(b10 >> 18) + _ALPHA.charAt((b10 >> 12) & 0x3F) + _ALPHA.charAt((b10 >> 6) & 0x3f) + _PADCHAR);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return x.join("");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // return {
|
|
|
+ // decode: _decode,
|
|
|
+ // encode: _encode,
|
|
|
+ // VERSION: _VERSION
|
|
|
+ // };
|
|
|
+
|
|
|
+ function transformCode(params) {
|
|
|
+ return encodeURIComponent(_encode(params))
|
|
|
+ }
|
|
|
+
|
|
|
+export default transformCode
|
|
|
+
|
|
|
+
|