Js implemented native base64 encoding and decoding string objects

Introduction: Recently maintain the node template development of jade items, the situation was awkward, and usually do very different, really uncomfortable. In particular there is a need to convert parameter is base64 spliced ​​to the url, I tried a variety of positions, only use native encoding and decoding methods, to sum up.

A. Btoa in the Window () and atoB () to resolve a string
that is only useful in encoding and decoding string. btoa () method uses the "AZ", "az", "0-9", "+", "/" and "=" character encoded string, returns a base-64 encoded string; atoB () for decoding. Usage: `encoding: const newBase = window.btoa (" test "); decoding: const oldValue = window.atob (newBase) ;`.
Note: If there is Chinese, need to use the URL used in conjunction with transcoding. Usage: `encoding: const newBase = window.btoa (window.encodeURIComponent ( JSON.stringify (" native js implemented base64 encoding and decoding string objects "))); decoding: const oldValue = window.decodeURIComponent (window.atob (newBase)); `

Two. Node.js Buffer (buffer) resolution objects
JavaScript language itself only string data type, no binary data type. But when dealing with streams like TCP stream or file, you must use the binary data. So Node.js, the definition of a Buffer class that is used to create a specialized storage buffer binary data. Whenever the need to handle I / O operations to move the data Node.js, Buffer is possible to use the library. Buffer objects created before v6.0 direct use new Buffer () constructor to create an object instance, so after v6.0, the official document which recommended Buffer.from () interfaces to create Buffer objects. Usage: `Buffer.from (JSON.stringify ({type :" xxx ", id:" xxx "})). ToString (" base64 ")`.

III. Js native resolution objects

let keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
encodeFuc: function (input) {
  let output = "", chr1, chr2, chr3, enc1, enc2, enc3, enc4, i = 0;
  input = utf8_encode(input);
  while (i < input.length) {
  chr1 = input.charCodeAt(i++);
  chr2 = input.charCodeAt(i++);
  chr3 = input.charCodeAt(i++);
  enc1 = chr1 >> 2;
  enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
  enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
  enc4 = chr3 & 63;
  if (isNaN(chr2)) {
    enc3 = enc4 = 64;
  } else if (isNaN(chr3)) {
    enc4 = 64;
  }
  output = output +
  keyStr.charAt(enc1) + keyStr.charAt(enc2) +
  keyStr.charAt(enc3) + keyStr.charAt(enc4);
  }
  return output;
}
utf8_encode: function (string) {
  string = string.replace(/\r\n/g,"\n");
  let utftext = "";
  for (let n = 0; n < string.length; n++) {
    let c = string.charCodeAt(n);
    if (c < 128) {
    utftext += String.fromCharCode(c);
  } else if((c > 127) && (c < 2048)) {
    utftext += String.fromCharCode((c >> 6) | 192);
    utftext += String.fromCharCode((c & 63) | 128);
  } else {
    utftext += String.fromCharCode((c >> 12) | 224);
    utftext += String.fromCharCode(((c >> 6) & 63) | 128);
    utftext += String.fromCharCode((c & 63) | 128);
  }

  }
  return utftext;
// coding
}
const newBase = encodeFuc(JSON.stringify({type: "xxx",id: "xxx"}));

decodeFuc: function (input) {
  let output = "", chr1, chr2, chr3, enc1, enc2, enc3, enc4, i = 0;
  input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
  while (i < input.length) {
    enc1 = keyStr.indexOf(input.charAt(i++));
    enc2 = keyStr.indexOf(input.charAt(i++));
    enc3 = keyStr.indexOf(input.charAt(i++));
    enc4 = keyStr.indexOf(input.charAt(i++));
    chr1 = (enc1 << 2) | (enc2 >> 4);
    chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
    chr3 = ((enc3 & 3) << 6) | enc4;
    output = output + String.fromCharCode(chr1);
    if (enc3 != 64) {
      output = output + String.fromCharCode(chr2);
    }
    if (enc4 != 64) {
      output = output + String.fromCharCode(chr3);
    }
  }
  output = utf8_decode(output);
  return output;
}
utf8_decode: function (utftext) {
  let string = "", i = 0, c = 0, c1 = 0, c2 = 0, c3 = 0;
  while ( i < utftext.length ) {
    c = utftext.charCodeAt(i);
    if (c < 128) {
      string += String.fromCharCode(c);
      i++;
    } else if((c > 191) && (c < 224)) {
      c2 = utftext.charCodeAt(i+1);
      string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
      i += 2;
    } else {
      c2 = utftext.charCodeAt(i+1);
      c3 = utftext.charCodeAt(i+2);
      string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
      i += 3;
    }
  }
  return string;
}
// 解码
const oldValue = JSON.parse(decodeFuc(newBase));

  



Guess you like

Origin www.cnblogs.com/zz-zrr/p/11544002.html