Created
February 25, 2011 14:55
-
-
Save revolunet/843889 to your computer and use it in GitHub Desktop.
LZW javascript compress/decompress
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// LZW-compress a string | |
function lzw_encode(s) { | |
var dict = {}; | |
var data = (s + "").split(""); | |
var out = []; | |
var currChar; | |
var phrase = data[0]; | |
var code = 256; | |
for (var i=1; i<data.length; i++) { | |
currChar=data[i]; | |
if (dict[phrase + currChar] != null) { | |
phrase += currChar; | |
} | |
else { | |
out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0)); | |
dict[phrase + currChar] = code; | |
code++; | |
phrase=currChar; | |
} | |
} | |
out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0)); | |
for (var i=0; i<out.length; i++) { | |
out[i] = String.fromCharCode(out[i]); | |
} | |
return out.join(""); | |
} | |
// Decompress an LZW-encoded string | |
function lzw_decode(s) { | |
var dict = {}; | |
var data = (s + "").split(""); | |
var currChar = data[0]; | |
var oldPhrase = currChar; | |
var out = [currChar]; | |
var code = 256; | |
var phrase; | |
for (var i=1; i<data.length; i++) { | |
var currCode = data[i].charCodeAt(0); | |
if (currCode < 256) { | |
phrase = data[i]; | |
} | |
else { | |
phrase = dict[currCode] ? dict[currCode] : (oldPhrase + currChar); | |
} | |
out.push(phrase); | |
currChar = phrase.charAt(0); | |
dict[code] = oldPhrase + currChar; | |
code++; | |
oldPhrase = phrase; | |
} | |
return out.join(""); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
A version designed for long string storage in UTF-8 encoded files using a base64 encoding. Works with unicode (including surrogates).
https://github.com/antonylesuisse/lzwjs/blob/master/lzw.js