LZW算法又叫“串表压缩算法”

function lzwCompress(str,bto64)//b64代表是否对其进行Base64编码
{
var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-";
//var str = Handle(_src);
var dictionary = {};
var result = [];
var index = 257;//从258开始是编码表
for (var i = 0; i < 256; i++)
dictionary[i] = i;
var p,bleng = 8;
var pc = [];
var entry = 0;
var astr=[];
for (var i=0;i<str.length;i++)
{
c = str.charCodeAt(i);
if ((c >= 0x0001) && (c <= 0x007F)) {
astr.push(c);
} else if (c > 0x07FF) {
astr.push(0xE0 | ((c >> 12) & 0x0F));
astr.push(0x80 | ((c >> 6) & 0x3F));
astr.push(0x80 | ((c >> 0) & 0x3F));
} else {
astr.push(0xC0 | ((c >> 6) & 0x1F));
astr.push(0x80 | ((c >> 0) & 0x3F));
}
}
pc[0] = astr[0];
result.push(256);
for(var i=1;i<astr.length;i++)
{
pc[1] = astr[i];
entry=(pc[0]<<16|pc[1]);
if(dictionary[entry]==undefined)
{
dictionary[entry] = ++index;
result.push(pc[0]);
pc[0] = pc[1];
}
else
{
pc[0] = dictionary[entry];
}
if (index >= 1 << 16) //编码用16位超过16位就加上重新开始标志
{
result.push(256);
index = 257;
dictionary = {};
for (var i = 0; i < 256; i++)
dictionary[i] = i;
}
}
result.push(pc[0]);
result.push(257);
//开始压缩字符串,初始位宽为9,最大为16
// sOut1 = "";
// for (var i = 0; i < result.length; i++) {
// sOut1 += result[i].toString();
// }
var sOut = '';
nTemp = 0;
BitLeft = 0;
nowBit = 9;
nowStag = 1 << nowBit;
nowTagCount = 258;
var b64 = [];
for (var i = 0; i < result.length; i++)
{
nTemp = nTemp + (result[i] << BitLeft);
nowTagCount += 1;
BitLeft += nowBit;
if(result[i]==256)
{
nowBit = 9;
nowStag = 1 << nowBit;
nowTagCount = 258;
}
if(nowTagCount>=nowStag)
{
nowBit +=1;
nowStag = 1 << nowBit;
}
while(BitLeft>=8)
{
if (bto64)
b64.push(nTemp & 0xFF);
else
b64.push(String.fromCharCode(nTemp & 0xFF));
nTemp=nTemp >> 8;
BitLeft -= 8;
}
}
if (BitLeft > 0)
if (bto64)
b64.push(nTemp & 0xFF);
else
b64.push(String.fromCharCode(nTemp & 0xFF));
if(!bto64)
return b64;
//base64可以单独程序,
var cl, cm, cr;
var len = b64.length;
var pos = 0;
while (pos < len)
{
cl = b64[pos++];
if (pos >= len) {
sOut += base64EncodeChars.charAt(cl >> 2);
sOut += base64EncodeChars.charAt((cl &0x3) << 4);
sOut += "==";
return sOut;
}
cm = b64[pos++];
if (pos >= len) {
sOut += base64EncodeChars.charAt(cl >> 2);
sOut += base64EncodeChars.charAt(((cl &0x3) << 4) | ((cm & 0xF0) >> 4));
sOut += base64EncodeChars.charAt((cm & 0xF) << 2);
sOut += "=";
return sOut;
}
cr = b64[pos++];
sOut += base64EncodeChars.charAt(cl >> 2);
sOut += base64EncodeChars.charAt(((cl &0x3) << 4) | ((cm & 0xF0) >> 4));
sOut += base64EncodeChars.charAt(((cm & 0xF) << 2) | ((cr & 0xC0) >> 6));
sOut += base64EncodeChars.charAt(cr & 0x3F);
}
return sOut;
}
这个就是那个lzwCompress的那个函数,用法如图..