base64 transcoding and decoding of js front end

Keywords: encoding Windows network ascii

Why do we use base

base64 is one of the most common encoding methods used to transmit 8-bit byte code on the network. Sometimes we need to encode the binary data in a form suitable for placement in the URL. At this time, base64 encoding is not readable, that is, the encoded data will not be directly seen by people. In addition, it can also be placed in the request header and the response header for transmission.

 

The most convenient transcoding and decoding methods are window.atob() and window.btoa()

The Window.atob() function is used to decode data that has been encoded by base-64.

window.btoa(): convert ascii string or binary data to a base64 encoded string

Note: the above method is not applicable to decryption with Chinese, that is, windows.btoa and windows.atob do not support Chinese

 

base64 transcoding with Chinese

Define an object first

var BASE64={
  
  enKey: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
  
  deKey: new Array(
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
    -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
    -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1
  ),
  
  encode: function(src){
    //Using an array to store encoded characters is much more efficient than adding strings.
    var str=new Array();
    var ch1, ch2, ch3;
    var pos=0;
    //Code every three characters.
    while(pos+3<=src.length){
      ch1=src.charCodeAt(pos++);
      ch2=src.charCodeAt(pos++);
      ch3=src.charCodeAt(pos++);
      str.push(this.enKey.charAt(ch1>>2), this.enKey.charAt(((ch1<<4)+(ch2>>4))&0x3f));
      str.push(this.enKey.charAt(((ch2<<2)+(ch3>>6))&0x3f), this.enKey.charAt(ch3&0x3f));
    }
    //Encode the remaining characters.
    if(pos<src.length){
      ch1=src.charCodeAt(pos++);
      str.push(this.enKey.charAt(ch1>>2));
      if(pos<src.length){
        ch2=src.charCodeAt(pos);
        str.push(this.enKey.charAt(((ch1<<4)+(ch2>>4))&0x3f));
        str.push(this.enKey.charAt(ch2<<2&0x3f), '=');
      }else{
        str.push(this.enKey.charAt(ch1<<4&0x3f), '==');
      }
    }
    //Combine the encoded characters to form a string.
    return str.join('');
  },
  
  decode: function(src){
    //Use an array to store the decoded characters.
    var str=new Array();
    var ch1, ch2, ch3, ch4;
    var pos=0;
    //Filter illegal characters and remove '='.
    src=src.replace(/[^A-Za-z0-9\+\/]/g, '');
    //decode the source string in partition of per four characters.
    while(pos+4<=src.length){
      ch1=this.deKey[src.charCodeAt(pos++)];
      ch2=this.deKey[src.charCodeAt(pos++)];
      ch3=this.deKey[src.charCodeAt(pos++)];
      ch4=this.deKey[src.charCodeAt(pos++)];
      str.push(String.fromCharCode(
        (ch1<<2&0xff)+(ch2>>4), (ch2<<4&0xff)+(ch3>>2), (ch3<<6&0xff)+ch4));
    }
    //Decode the remaining characters.
    if(pos+1<src.length){
      ch1=this.deKey[src.charCodeAt(pos++)];
      ch2=this.deKey[src.charCodeAt(pos++)];
      if(pos<src.length){
        ch3=this.deKey[src.charCodeAt(pos)];
        str.push(String.fromCharCode((ch1<<2&0xff)+(ch2>>4), (ch2<<4&0xff)+(ch3>>2)));
      }else{
        str.push(String.fromCharCode((ch1<<2&0xff)+(ch2>>4)));
      }
    }
    //Combine the decoded characters to form a string.
    return str.join('');
  }
};

Call directly when using

var str='Hello';
var enstr=BASE64.encode(str);
alert(enstr);
var destr=BASE64.decode(enstr);
alert(destr);

 

Posted by ddevitt on Mon, 23 Dec 2019 09:31:31 -0800