原生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(''));
}