1.12 Encoding and Decoding Base64 Strings

NN 2, IE 3

1.12.1 Problem

You want to convert a string to or from Base64 encoding.

1.12.2 Solution

Use the functions of the base64.js library shown in the Discussion. Syntax for invoking the two functions is straightforward. To encode a string, invoke:

var encodedString = base64Encode("stringToEncode");

To decode a string, invoke:

var plainString = base64Decode("encodedString");

1.12.3 Discussion

Example 1-2 shows the entire base64.js library.

Example 1-2. base64.js library
// Global lookup arrays for base64 conversions var enc64List, dec64List;     // Load the lookup arrays once function initBase64( ) {     enc64List = new Array( );     dec64List = new Array( );     var i;     for (i = 0; i < 26; i++) {         enc64List[enc64List.length] = String.fromCharCode(65 + i);     }     for (i = 0; i < 26; i++) {         enc64List[enc64List.length] = String.fromCharCode(97 + i);     }     for (i = 0; i < 10; i++) {         enc64List[enc64List.length] = String.fromCharCode(48 + i);     }     enc64List[enc64List.length] = "+";     enc64List[enc64List.length] = "/";     for (i = 0; i < 128; i++) {         dec64List[dec64List.length] = -1;     }     for (i = 0; i < 64; i++) {         dec64List[enc64List[i].charCodeAt(0)] = i;     } }     // Encode a string function base64Encode(str) {     var c, d, e, end = 0;     var u, v, w, x;     var ptr = -1;     var input = str.split("");     var output = "";     while(end =  = 0) {         c = (typeof input[++ptr] != "undefined") ? input[ptr].charCodeAt(0) :              ((end = 1) ? 0 : 0);         d = (typeof input[++ptr] != "undefined") ? input[ptr].charCodeAt(0) :              ((end += 1) ? 0 : 0);         e = (typeof input[++ptr] != "undefined") ? input[ptr].charCodeAt(0) :              ((end += 1) ? 0 : 0);         u = enc64List[c >> 2];         v = enc64List[(0x00000003 & c) << 4 | d >> 4];         w = enc64List[(0x0000000F & d) << 2 | e >> 6];         x = enc64List[e & 0x0000003F];                  // handle padding to even out unevenly divisible string lengths         if (end >= 1) {x = "=";}         if (end =  = 2) {w = "=";}         if (end < 3) {output += u + v + w + x;}     }     // format for 76-character line lengths per RFC     var formattedOutput = "";     var lineLength = 76;     while (output.length > lineLength) {         formattedOutput += output.substring(0, lineLength) + "\n";         output = output.substring(lineLength);     }     formattedOutput += output;     return formattedOutput; }     // Decode a string function base64Decode(str) {     var c=0, d=0, e=0, f=0, i=0, n=0;     var input = str.split("");     var output = "";     var ptr = 0;     do {         f = input[ptr++].charCodeAt(0);         i = dec64List[f];         if ( f >= 0 && f < 128 && i != -1 ) {             if ( n % 4 =  = 0 ) {                 c = i << 2;             } else if ( n % 4 =  = 1 ) {                 c = c | ( i >> 4 );                 d = ( i & 0x0000000F ) << 4;             } else if ( n % 4 =  = 2 ) {                 d = d | ( i >> 2 );                 e = ( i & 0x00000003 ) << 6;             } else {                 e = e | i;             }             n++;             if ( n % 4 =  = 0 ) {                 output += String.fromCharCode(c) +                            String.fromCharCode(d) +                            String.fromCharCode(e);             }         }     } while (typeof input[ptr] != "undefined");     output += (n % 4 =  = 3) ? String.fromCharCode(c) + String.fromCharCode(d) :                ((n % 4 =  = 2) ? String.fromCharCode(c) : "");     return output; }     // Self-initialize the global variables initBase64( );

The library begins with two global declarations and an initialization function that creates lookup tables for the character conversions. At the end of the library is a statement that invokes the initialization function.

Scripts may call the base64Encode( ) function directly to convert a standard string to a Base64-encoded string. The value of the original string is not changed, but the function returns an encoded copy. To convert an encoded string to a standard string, use the base64Decode( ) function, passing the encoded string as an argument.

Netscape 6 and later include global methods that perform the same conversions shown at length in the solution. The atob( ) method converts a Base64-encoded string to a plain string; the btoa( ) method converts a plain string to a Base64-encoded string. These methods are not part of the ECMAScript standard used as the foundation for these browser versions, so it's unclear when or if they will find their way into other browsers.

Frankly, there hasn't been a big need for Base64 encoding in most scripted web pages, but that's perhaps because the facilities weren't readily available. A Base64-encoded string contains a very small character set: a-z, A-Z, 0-9, +, /, and =. This low common denominator scheme allows data of any type to be conveyed by virtually any internet protocol. Binary attachments to your email are encoded as Base64 strings for their journey en route. Your email client decodes the simple string and generates the image, document, or executable file that arrives with the message. You may find additional ways to apply Base64-encoded data in your pages and scripts. To learn more about Base64 encoding, visit http://www.ietf.org/rfc/rfc2045.txt.

1.12.4 See Also

Recipe 1.11 for URL-encoding techniques.



JavaScript & DHTML Cookbook
JavaScript & DHTML Cookbook (2nd edition)
ISBN: 0596514085
EAN: 2147483647
Year: 2005
Pages: 249
Authors: Danny Goodman

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net