base64编码解码
function JSA_A_BTOA(url) { //base64编码
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
const outputChunks = [];
const buffer = [];
// 处理完整3字节组
for (let i = 0; i < url.length; i++) {
buffer.push(url.charCodeAt(i));
if (buffer.length === 3) {
const merged = (buffer[0] << 16) | (buffer[1] << 8) | buffer[2];
outputChunks.push(
chars.charAt(merged >> 18 & 0x3F),
chars.charAt(merged >> 12 & 0x3F),
chars.charAt(merged >> 6 & 0x3F),
chars.charAt(merged & 0x3F)
);
buffer.length = 0;
}
}
// 处理剩余字节(1或2字节)
const remaining = buffer.length;
if (remaining === 1 || remaining === 2) {
let merged = buffer[0] << 16;
if (remaining === 2) merged |= buffer[1] << 8;
// 前两个字符始终需要生成
outputChunks.push(
chars.charAt(merged >> 18 & 0x3F), // 第一个字符(高6位)
chars.charAt(merged >> 12 & 0x3F) // 第二个字符(次高6位)
);
// 仅在剩余2字节时生成第三个字符
if (remaining === 2) {
outputChunks.push(chars.charAt(merged >> 6 & 0x3F));
}
// 添加填充符
outputChunks.push(remaining === 1 ? '==' : '=');
}
return outputChunks.join('');
}
function JSA_A_ATOB(base64) { //base64解码
const base64Chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
// 1. 预处理:移除非法字符并补足填充符
let cleanInput = base64.replace(/[^A-Za-z0-9\+\/]/g, '');
const padCount = (4 - (cleanInput.length % 4)) % 4;
cleanInput = cleanInput.padEnd(cleanInput.length + padCount, '=');
// 2. 构建字符索引映射表(加速查找)
const charMap = {};
for (let i = 0; i < base64Chars.length; i++) {
charMap[base64Chars[i]] = i;
}
// 3. 解码核心逻辑(使用普通数组存储字节)
const byteArray = [];
for (let i = 0; i < cleanInput.length; i += 4) {
// 3.1 获取4字符对应的6比特值
const a = charMap[cleanInput[i]];
const b = charMap[cleanInput[i + 1]];
const c = charMap[cleanInput[i + 2]];
const d = charMap[cleanInput[i + 3]];
// 3.2 重组24比特数据
const triple = (a << 18) | (b << 12) | (c << 6) | d;
// 3.3 提取3字节(动态处理填充符)
byteArray.push((triple >> 16) & 0xFF);
if (cleanInput[i + 2] !== '=') byteArray.push((triple >> 8) & 0xFF);
if (cleanInput[i + 3] !== '=') byteArray.push(triple & 0xFF);
}
// 4. 将字节数组转为字符串(兼容多字节字符)Latin1编码(仅ASCII)
return String.fromCharCode.apply(null, byteArray);
}
function JSA_E_DECODEURL(url) {
return decodeURIComponent(url);
}