You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
178 lines
3.7 KiB
Plaintext
178 lines
3.7 KiB
Plaintext
/**
|
|
* Created by 69023 on 2019-01-02.
|
|
*/
|
|
|
|
jQuery.base64 = (function ($) {
|
|
|
|
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
|
|
};
|
|
|
|
}(jQuery)); |