123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285 |
- // Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>
- // This work is free. You can redistribute it and/or modify it
- // under the terms of the WTFPL, Version 2
- // For more information see LICENSE.txt or http://www.wtfpl.net/
- //
- // This lib is part of the lz-string project.
- // For more information, the home page:
- // http://pieroxy.net/blog/pages/lz-string/index.html
- //
- // Base64 compression / decompression for already compressed content (gif, png, jpg, mp3, ...)
- // version 1.4.1
- var Base64String = {
-
- compressToUTF16 : function (input) {
- var output = [],
- i,c,
- current,
- status = 0;
-
- input = this.compress(input);
-
- for (i=0 ; i<input.length ; i++) {
- c = input.charCodeAt(i);
- switch (status++) {
- case 0:
- output.push(String.fromCharCode((c >> 1)+32));
- current = (c & 1) << 14;
- break;
- case 1:
- output.push(String.fromCharCode((current + (c >> 2))+32));
- current = (c & 3) << 13;
- break;
- case 2:
- output.push(String.fromCharCode((current + (c >> 3))+32));
- current = (c & 7) << 12;
- break;
- case 3:
- output.push(String.fromCharCode((current + (c >> 4))+32));
- current = (c & 15) << 11;
- break;
- case 4:
- output.push(String.fromCharCode((current + (c >> 5))+32));
- current = (c & 31) << 10;
- break;
- case 5:
- output.push(String.fromCharCode((current + (c >> 6))+32));
- current = (c & 63) << 9;
- break;
- case 6:
- output.push(String.fromCharCode((current + (c >> 7))+32));
- current = (c & 127) << 8;
- break;
- case 7:
- output.push(String.fromCharCode((current + (c >> 8))+32));
- current = (c & 255) << 7;
- break;
- case 8:
- output.push(String.fromCharCode((current + (c >> 9))+32));
- current = (c & 511) << 6;
- break;
- case 9:
- output.push(String.fromCharCode((current + (c >> 10))+32));
- current = (c & 1023) << 5;
- break;
- case 10:
- output.push(String.fromCharCode((current + (c >> 11))+32));
- current = (c & 2047) << 4;
- break;
- case 11:
- output.push(String.fromCharCode((current + (c >> 12))+32));
- current = (c & 4095) << 3;
- break;
- case 12:
- output.push(String.fromCharCode((current + (c >> 13))+32));
- current = (c & 8191) << 2;
- break;
- case 13:
- output.push(String.fromCharCode((current + (c >> 14))+32));
- current = (c & 16383) << 1;
- break;
- case 14:
- output.push(String.fromCharCode((current + (c >> 15))+32, (c & 32767)+32));
- status = 0;
- break;
- }
- }
- output.push(String.fromCharCode(current + 32));
- return output.join('');
- },
-
- decompressFromUTF16 : function (input) {
- var output = [],
- current,c,
- status=0,
- i = 0;
-
- while (i < input.length) {
- c = input.charCodeAt(i) - 32;
-
- switch (status++) {
- case 0:
- current = c << 1;
- break;
- case 1:
- output.push(String.fromCharCode(current | (c >> 14)));
- current = (c&16383) << 2;
- break;
- case 2:
- output.push(String.fromCharCode(current | (c >> 13)));
- current = (c&8191) << 3;
- break;
- case 3:
- output.push(String.fromCharCode(current | (c >> 12)));
- current = (c&4095) << 4;
- break;
- case 4:
- output.push(String.fromCharCode(current | (c >> 11)));
- current = (c&2047) << 5;
- break;
- case 5:
- output.push(String.fromCharCode(current | (c >> 10)));
- current = (c&1023) << 6;
- break;
- case 6:
- output.push(String.fromCharCode(current | (c >> 9)));
- current = (c&511) << 7;
- break;
- case 7:
- output.push(String.fromCharCode(current | (c >> 8)));
- current = (c&255) << 8;
- break;
- case 8:
- output.push(String.fromCharCode(current | (c >> 7)));
- current = (c&127) << 9;
- break;
- case 9:
- output.push(String.fromCharCode(current | (c >> 6)));
- current = (c&63) << 10;
- break;
- case 10:
- output.push(String.fromCharCode(current | (c >> 5)));
- current = (c&31) << 11;
- break;
- case 11:
- output.push(String.fromCharCode(current | (c >> 4)));
- current = (c&15) << 12;
- break;
- case 12:
- output.push(String.fromCharCode(current | (c >> 3)));
- current = (c&7) << 13;
- break;
- case 13:
- output.push(String.fromCharCode(current | (c >> 2)));
- current = (c&3) << 14;
- break;
- case 14:
- output.push(String.fromCharCode(current | (c >> 1)));
- current = (c&1) << 15;
- break;
- case 15:
- output.push(String.fromCharCode(current | c));
- status=0;
- break;
- }
-
-
- i++;
- }
-
- return this.decompress(output.join(''));
- //return output;
-
- },
- // private property
- _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
-
- decompress : function (input) {
- var output = [];
- var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
- var i = 1;
- var odd = input.charCodeAt(0) >> 8;
-
- while (i < input.length*2 && (i < input.length*2-1 || odd==0)) {
-
- if (i%2==0) {
- chr1 = input.charCodeAt(i/2) >> 8;
- chr2 = input.charCodeAt(i/2) & 255;
- if (i/2+1 < input.length)
- chr3 = input.charCodeAt(i/2+1) >> 8;
- else
- chr3 = NaN;
- } else {
- chr1 = input.charCodeAt((i-1)/2) & 255;
- if ((i+1)/2 < input.length) {
- chr2 = input.charCodeAt((i+1)/2) >> 8;
- chr3 = input.charCodeAt((i+1)/2) & 255;
- } else
- chr2=chr3=NaN;
- }
- i+=3;
-
- enc1 = chr1 >> 2;
- enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
- enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
- enc4 = chr3 & 63;
-
- if (isNaN(chr2) || (i==input.length*2+1 && odd)) {
- enc3 = enc4 = 64;
- } else if (isNaN(chr3) || (i==input.length*2 && odd)) {
- enc4 = 64;
- }
-
- output.push(this._keyStr.charAt(enc1));
- output.push(this._keyStr.charAt(enc2));
- output.push(this._keyStr.charAt(enc3));
- output.push(this._keyStr.charAt(enc4));
- }
-
- return output.join('');
- },
-
- compress : function (input) {
- var output = [],
- ol = 1,
- output_,
- chr1, chr2, chr3,
- enc1, enc2, enc3, enc4,
- i = 0, flush=false;
-
- 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;
-
- if (ol%2==0) {
- output_ = chr1 << 8;
- flush = true;
-
- if (enc3 != 64) {
- output.push(String.fromCharCode(output_ | chr2));
- flush = false;
- }
- if (enc4 != 64) {
- output_ = chr3 << 8;
- flush = true;
- }
- } else {
- output.push(String.fromCharCode(output_ | chr1));
- flush = false;
-
- if (enc3 != 64) {
- output_ = chr2 << 8;
- flush = true;
- }
- if (enc4 != 64) {
- output.push(String.fromCharCode(output_ | chr3));
- flush = false;
- }
- }
- ol+=3;
- }
-
- if (flush) {
- output.push(String.fromCharCode(output_));
- output = output.join('');
- output = String.fromCharCode(output.charCodeAt(0)|256) + output.substring(1);
- } else {
- output = output.join('');
- }
-
- return output;
-
- }
- }
|