Ascii85

HTML

<b>Ascii85 JavaScript Implementation</b>
<br />
<input type="text" id="a" />
<input type="submit" value="encode" onclick="$('#b').val(Ascii85.encode($('#a').val()));$('#a').val('');" />
<br />
<input type="text" id="b" />
<input type="submit" value="decode" onclick="$('#a').val(Ascii85.decode($('#b').val()));$('#b').val('');" />

CSS

body { padding: 50px; font-family: Arial, Helvetica, sans-serif; }
input { padding: 5px; margin: 5px 0; }
input[type=text] { width: 200px; }

JavaScript

// Ascii85 JavaScript implementation
// 2012.10.16 Jim Herrero

var Ascii85 = {
    // defaults
    _alphabet: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!#$%()*+,-./:;=?@[]^_{}",
    _prefix: "<~",
    _suffix: "~>",
    
    // functions
    encode: function(input, alphabet, pre, suf) {
        var alphabet = alphabet || Ascii85._alphabet,
            pre = pre || Ascii85._prefix,
            suf = suf || Ascii85._suffix,
            useShort = alphabet.length > 85,
            output = "", buffer, val, i, j, l;

        for (i = 0, l = input.length; i < l;) {
            buffer = [0,0,0,0];
            for (j = 0; j < 4; j++)
                if(input[i])
                  buffer[j] = input.charCodeAt(i++);

            for (val = buffer[3], j = 2; j >= 0; j--)
                val = val*256+buffer[j];
            
            if (useShort && !val) 
                output += alphabet[86];
            else if (useShort && val == 0x20202020) 
                output += alphabet[85];
            else {
                for (j = 0; j < 5; j++) {
                    output += alphabet[val%85];
                    val = Math.floor(val/85);
                }
            }
        }

        return pre+output+suf;
    },
    
    decode: function(input, alphabet, pre, suf) {
        var alphabet = alphabet || Ascii85._alphabet,
            pre = pre || Ascii85._prefix,
            suf = suf || Ascii85._suffix,
            useShort = alphabet.length > 85,
            output = "", buffer, val, i, j, l;
        var match = input.match( new RegExp(pre+"(.*?)"+suf) );
        input = match ? match[1] || "" : "";
        
        if(useShort){
            var spacer = alphabet[43]+alphabet[67]+alphabet[53]+alphabet[27]+alphabet[10];
            input = input.replace(new RegExp(alphabet[86],'g'), new Array(6).join(alphabet[0]))
                         .replace(new RegExp(alphabet[85],'g'), spacer);
        }

        for(i = 0, l = input.length; i < l;) {
  ...