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);

}

云南省
浏览 154
2
3
分享
3 +1
1
2 +1
全部评论 1
 
学起
· 湖南省
回复