Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can you encode a string to Base64 in JavaScript?

I have a PHP script that can encode a PNG image to a Base64 string.

I'd like to do the same thing using JavaScript. I know how to open files, but I'm not sure how to do the encoding. I'm not used to working with binary data.

like image 623
username Avatar asked Oct 29 '08 13:10

username


People also ask

How do I encode a string in Base64?

If we were to Base64 encode a string we would follow these steps: Take the ASCII value of each character in the string. Calculate the 8-bit binary equivalent of the ASCII values. Convert the 8-bit chunks into chunks of 6 bits by simply re-grouping the digits.

What is Base64 in JavaScript?

Base64 is a group of similar binary-to-text encoding schemes that represent binary data in an ASCII string format by translating it into a radix-64 representation.

How are strings encoded in JavaScript?

In order to encode/decode a string in JavaScript, We are using built-in functions provided by JavaScript. btoa(): This method encodes a string in base-64 and uses the “A-Z”, “a-z”, “0-9”, “+”, “/” and “=” characters to encode the provided string.

What does BTOA do in JavaScript?

The btoa() method creates a Base64-encoded ASCII string from a binary string (i.e., a string in which each character in the string is treated as a byte of binary data).


2 Answers

From here:

/** * *  Base64 encode / decode *  http://www.webtoolkit.info/ * **/ var Base64 = {      // private property     _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",      // public method for encoding     encode : function (input) {         var output = "";         var chr1, chr2, chr3, enc1, enc2, enc3, enc4;         var i = 0;          input = Base64._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 +             this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +             this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);         }         return output;     },      // public method for decoding     decode : function (input) {         var output = "";         var chr1, chr2, chr3;         var enc1, enc2, enc3, enc4;         var i = 0;          input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");          while (i < input.length) {              enc1 = this._keyStr.indexOf(input.charAt(i++));             enc2 = this._keyStr.indexOf(input.charAt(i++));             enc3 = this._keyStr.indexOf(input.charAt(i++));             enc4 = this._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 = Base64._utf8_decode(output);          return output;     },      // private method for UTF-8 encoding     _utf8_encode : function (string) {         string = string.replace(/\r\n/g,"\n");         var utftext = "";          for (var n = 0; n < string.length; n++) {              var 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;     },      // private method for UTF-8 decoding     _utf8_decode : function (utftext) {         var string = "";         var i = 0;         var c = c1 = c2 = 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;     } } 

Also, search for "JavaScript base64 encoding" turns up a lot of other options, and the above was the first one.

like image 24
Sunny Milenov Avatar answered Oct 04 '22 10:10

Sunny Milenov


You can use btoa() and atob() to convert to and from base64 encoding.

There appears to be some confusion in the comments regarding what these functions accept/return, so…

  • btoa() accepts a “string” where each character represents an 8-bit byte – if you pass a string containing characters that can’t be represented in 8 bits, it will probably break. This isn’t a problem if you’re actually treating the string as a byte array, but if you’re trying to do something else then you’ll have to encode it first.

  • atob() returns a “string” where each character represents an 8-bit byte – that is, its value will be between 0 and 0xff. This does not mean it’s ASCII – presumably if you’re using this function at all, you expect to be working with binary data and not text.

See also:

  • How do I load binary image data using Javascript and XMLHttpRequest?

Most comments here are outdated. You can probably use both btoa() and atob(), unless you support really outdated browsers.

Check here:

  • https://caniuse.com/?search=atob
  • https://caniuse.com/?search=btoa
like image 150
Shog9 Avatar answered Oct 04 '22 10:10

Shog9