base64 methods

Benchmark created by Jens on


Description

Different algorithms/implementations for encoding data in base64 with Javascript

btoa

btoa Unicode

PHP.js base64_encode

btoa2

Webtoolkit

Preparation HTML

<script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
 
<script>
  var plain_url = 'http://www.example.com/pathname?some_parameter=some_value#some_hash';
  
  
  
  
  function base64_encode (data) {
      // http://kevin.vanzonneveld.net
      // +   original by: Tyler Akins (http://rumkin.com)
      // +   improved by: Bayron Guevara
      // +   improved by: Thunder.m
      // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
      // +   bugfixed by: Pellentesque Malesuada
      // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
      // -    depends on: utf8_encode
      // *     example 1: base64_encode('Kevin van Zonneveld');
      // *     returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA=='
      // mozilla has this native
      // - but breaks in 2.0.0.12!
      //if (typeof this.window['atob'] == 'function') {
      //    return atob(data);
      //}
      var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
      var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
          ac = 0,
          enc = "",
          tmp_arr = [];
  
      if (!data) {
          return data;
      }
  
      data = this.utf8_encode(data + '');
  
      do { // pack three octets into four hexets
          o1 = data.charCodeAt(i++);
          o2 = data.charCodeAt(i++);
          o3 = data.charCodeAt(i++);
  
          bits = o1 << 16 | o2 << 8 | o3;
  
          h1 = bits >> 18 & 0x3f;
          h2 = bits >> 12 & 0x3f;
          h3 = bits >> 6 & 0x3f;
          h4 = bits & 0x3f;
  
          // use hexets to index into b64, and append result to encoded string
          tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
      } while (i < data.length);
  
      enc = tmp_arr.join('');
  
      switch (data.length % 3) {
      case 1:
          enc = enc.slice(0, -2) + '==';
          break;
      case 2:
          enc = enc.slice(0, -1) + '=';
          break;
      }
  
      return enc;
  }
  function utf8_encode (argString) {
      // http://kevin.vanzonneveld.net
      // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
      // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
      // +   improved by: sowberry
      // +    tweaked by: Jack
      // +   bugfixed by: Onno Marsman
      // +   improved by: Yves Sucaet
      // +   bugfixed by: Onno Marsman
      // +   bugfixed by: Ulrich
      // +   bugfixed by: Rafal Kukawski
      // *     example 1: utf8_encode('Kevin van Zonneveld');
      // *     returns 1: 'Kevin van Zonneveld'
  
      if (argString === null || typeof argString === "undefined") {
          return "";
      }
  
      var string = (argString + ''); // .replace(/\r\n/g, "\n").replace(/\r/g, "\n");
      var utftext = "",
          start, end, stringl = 0;
  
      start = end = 0;
      stringl = string.length;
      for (var n = 0; n < stringl; n++) {
          var c1 = string.charCodeAt(n);
          var enc = null;
  
          if (c1 < 128) {
              end++;
          } else if (c1 > 127 && c1 < 2048) {
              enc = String.fromCharCode((c1 >> 6) | 192) + String.fromCharCode((c1 & 63) | 128);
          } else {
              enc = String.fromCharCode((c1 >> 12) | 224) + String.fromCharCode(((c1 >> 6) & 63) | 128) + String.fromCharCode((c1 & 63) | 128);
          }
          if (enc !== null) {
              if (end > start) {
                  utftext += string.slice(start, end);
              }
              utftext += enc;
              start = end = n + 1;
          }
      }
  
      if (end > start) {
          utftext += string.slice(start, stringl);
      }
  
      return utftext;
  }
  
  
  
  
  
  
  /*
   * base64.js - Base64 encoding and decoding functions
   *
   * See: http://developer.mozilla.org/en/docs/DOM:window.btoa
   *      http://developer.mozilla.org/en/docs/DOM:window.atob
   *
   * Copyright (c) 2007, David Lindquist <david.lindquist@gmail.com>
   * Released under the MIT license
   */
  
      function btoa2(str) {
          var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
          var encoded = [];
          var c = 0;
          while (c < str.length) {
              var b0 = str.charCodeAt(c++);
              var b1 = str.charCodeAt(c++);
              var b2 = str.charCodeAt(c++);
              var buf = (b0 << 16) + ((b1 || 0) << 8) + (b2 || 0);
              var i0 = (buf & (63 << 18)) >> 18;
              var i1 = (buf & (63 << 12)) >> 12;
              var i2 = isNaN(b1) ? 64 : (buf & (63 << 6)) >> 6;
              var i3 = isNaN(b2) ? 64 : (buf & 63);
              encoded[encoded.length] = chars.charAt(i0);
              encoded[encoded.length] = chars.charAt(i1);
              encoded[encoded.length] = chars.charAt(i2);
              encoded[encoded.length] = chars.charAt(i3);
          }
          return encoded.join('');
      }
  
  
  
  
  
  
  var toolkitBase64 = {
  
  _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
  
  encode : function (input) {
      var output = "";
      var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
      var i = 0;
  
      input = toolkitBase64._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;
  },
  
  _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;
  }
  
  }
  
  
  
  
  
  
  
</script>

Test runner

Ready to run.

Testing in
TestOps/sec
btoa (not IE)
btoa(plain_url);
ready
btoa Unicode (not IE)
btoa(unescape(encodeURIComponent( plain_url )));
ready
PHP.js base64_encode
base64_encode(plain_url);
ready
btoa2
btoa2(plain_url);
ready
Webtoolkit Base64
toolkitBase64.encode(plain_url);
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.