vue-office/core/utils/base64.js

60 lines
2.2 KiB
JavaScript

let hexIn = false;
function utf16to8(str) {
var out, i, len, c;
var charCode;
out = hexIn ? [] : '';
len = str.length;
for(i = 0; i < len; i++) {
c = hexIn ? str[i] : str.charCodeAt(i);
if ((c >= 0x0001) && (c <= 0x007F)) {
hexIn ? out.push(str[i]) : out += str.charAt(i);
} else if (c > 0x07FF) {
charCode = (0xE0 | ((c >> 12) & 0x0F)); hexIn ? out.push(charCode) : out += String.fromCharCode(charCode);
charCode = (0x80 | ((c >> 6) & 0x3F)); hexIn ? out.push(charCode) : out += String.fromCharCode(charCode);
charCode = (0x80 | ((c >> 0) & 0x3F)); hexIn ? out.push(charCode) : out += String.fromCharCode(charCode);
} else {
charCode = (0xC0 | ((c >> 6) & 0x1F)); hexIn ? out.push(charCode) : out += String.fromCharCode(charCode);
charCode = (0x80 | ((c >> 0) & 0x3F)); hexIn ? out.push(charCode) : out += String.fromCharCode(charCode);
}
}
return out;
}
var base64EncodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
function base64encode(str) {
var out, i, len;
var c1, c2, c3;
var charCode;
len = str.length;
i = 0;
out = '';
while(i < len) {
c1 = (hexIn ? str[i++] : str.charCodeAt(i++)) & 0xff;
if(i == len)
{
out += base64EncodeChars.charAt(c1 >> 2);
out += base64EncodeChars.charAt((c1 & 0x3) << 4);
out += '==';
break;
}
c2 = (hexIn ? str[i++] : str.charCodeAt(i++));
if(i == len)
{
out += base64EncodeChars.charAt(c1 >> 2);
out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
out += base64EncodeChars.charAt((c2 & 0xF) << 2);
out += '=';
break;
}
c3 = (hexIn ? str[i++] : str.charCodeAt(i++));
out += base64EncodeChars.charAt(c1 >> 2);
out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6));
out += base64EncodeChars.charAt(c3 & 0x3F);
}
return out;
}
export function base64_encode(src) {
return base64encode(utf16to8(src));
}