js LZ77算法的实现代码
所以钻研了一段时间的gzip,后来发现还是仅用LZ77 比较容易实现,gzip中的 haffman 压缩部分对于JS来说太难搞了。
代码如下,注释的非常完整,所以就不多说了,有兴趣的可以仔细研究下:
LZ77
* { font-size:12px; }
body { overflow:auto; background-color:buttonface; }
textarea { width:100%; height:240px; overflow:auto; }
#btn1 { width:100px; }
window.onload = init;
function $(s){ return document.getElementById(s); }
function init()
{
$("txtS").focus();
$("btn1").onclick = run;
$("txtS").onkeydown = function ()
{
if (event.keyCode == 13 && event.ctrlKey)
{
run();
}
}
}
function run()
{
var str = $("txtS").value;
$("txtS").value = "";
var lzc = new Lz77CompressDefer(str);
var t = new Date();
lzc.start(function (result)
{
$("txtR").value = Lz77SelfExtract(result);
var tc = new Date() - t;
$("txtS").value = eval($("txtR").value.substring(4));
var td = new Date() - t - tc;
alert("压缩完毕\r\n压缩比:"+($("txtR").value.length/str.length*100).toFixed(2)+"%\r\n压缩用时:"+tc+"ms\r\n解压用时:"+td+"ms\r\n校验:"+(str==$("txtS").value?"OK":"failed"));
});
function showProgress(){
var p = lzc.status();
if (p ?".split("");
for (var i=0; i 7 && j > match_len) //如果此匹配比已发现的匹配长
{
match_len = j; //记录匹配长度
match_off = lp; //记录匹配位置
}
}
/*匹配处理*/
if (match_len > 7) //如果找到了符合要求的匹配
{
if (last_match_len != 0 && last_match_len ?".split(""),_=[];while(++p 400)
{
return setTimeout(run);
}
index = input.substring(p, p+7); //取当前字符开始的7个字符作为索引
/*链表维护*/
prev[p] = head[index]; //当前头位置进链表
head[index] = p; //保存现在位置进头信息
/*匹配*/
lp = p; //初始化链表查询指针
match_len = 0; //初始化匹配长度
match_off = 0; //初始化匹配位置
if (prev[lp]) //如果链表上存在上一个匹配
{
/*匹配查询*/
while (prev[lp]) //依次查看链表上的每个位置
{
lp = prev[lp]; //取出链表上的前一个位置到链表查询指针
for (j=1; j 7 && j > match_len) //如果此匹配比已发现的匹配长
{
match_len = j; //记录匹配长度
match_off = lp; //记录匹配位置
}
}
/*匹配处理*/
if (match_len > 7) //如果找到了符合要求的匹配
{
if (last_match_len != 0 && last_match_len
[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]