原生jsはBase 64の符号化と復号化を実現する
2814 ワード
/**
* @description base64
* @param val
* @return base64
* , base64Encode(encodeURIComponent(a))
*/
function base64Encode(val){
var base64hash = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
val=encodeURIComponent(val);
//
var strArr = val.split('');
//
var result = [];
// ascii
var asciiCode;
// ascii
var prevAsciiCode;
var mod;
// 3
var preMod = strArr.length % 3;
//
if(preMod == 1){
strArr.push(null);
strArr.push(null);
}
if(preMod == 2) strArr.push(null);
// , ascii
for(var index in strArr){
if(!strArr[index]){
asciiCode = 0;
}
else{
asciiCode = strArr[index].charCodeAt();
}
//
mod = index % 3;
switch(mod){
case 0:
// 2
result.push(base64hash[asciiCode >> 2]);
break;
case 1:
// ascii 4 ascii
result.push(base64hash[(prevAsciiCode & 3) << 4 | asciiCode >> 4]);
break;
case 2:
// ascii :01000111,00000011,00000000
//2 , ascii 15 , , ascii 6
result.push(base64hash[(prevAsciiCode & 15) << 2 | asciiCode >> 6]);
// 2 6 1 , 6
result.push(base64hash[asciiCode & 63]);
break
}
prevAsciiCode = asciiCode
}
//
if(preMod == 1) {
result.splice(result.length - 2,2);
result.push('==');
}
else if(preMod == 2) {
result.pop();
result.push('=');
}
return result.join('');
}
/**
* Base64
* @param val base
* @returns {string}
*/
function base64Decode(val){
var base64hash = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
//
var strArr = val.split('');
//
var result = [];
var preCode;
var code;
// ,1-3
var n;
for(var i in strArr){
n=i%4;
code=base64hash.indexOf(strArr[i]);
switch(n){
case 0:
preCode=base64hash.indexOf(strArr[i]);
break;
case 1:
result.push(String.fromCharCode(preCode<<2|(code&48)>>4));
break;
case 2:
result.push(String.fromCharCode((preCode&15)<<4 |(code&60)>>2));
break;
case 3:
result.push(String.fromCharCode(((preCode&3)<<6)|code));
break;
}
preCode=code;
}
return decodeURIComponent(result.join(''));
}