JS LZW算法压缩与解压

简介: JS LZW算法压缩与解压,一个JavaScript二进制接口源码,LZW 压缩解压算法,压缩比确实不错,代码不超过200行。LZW 压缩解压* { font-size:12px}body { overflow:auto; border-style:none; backgroun...

JS LZW算法压缩与解压,一个JavaScript二进制接口源码,LZW 压缩解压算法,压缩比确实不错,代码不超过200行。

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>LZW 压缩解压</title>
<style>
* { font-size:12px}
body { overflow:auto; border-style:none; background-color:buttonface; }
#source, #result { overflow:auto; width:100%; height:300px; }
</style>
<script>
function $(s){ return document.getElementById(s); }
window.onload = function(){
    $("source").focus();
    $("source").onkeydown = function(e){
        e = window.event || e;
        if(e.keyCode == 13 && e.ctrlKey)doit();
    }
   
    $("result").onkeydown = function(e){
        e = window.event || e;
        if(e.keyCode == 13 && e.ctrlKey)doit2();
    }
   
    $("source").value = document.getElementsByTagName("script")[0].innerHTML;
   
}
function doit(){
    $("result").value = $("chkSE").checked?("eval(("+String(lzw_decompress)+")(\""+lzw_compress($("source").value)+"\"))"):(lzw_compress($("source").value));
    $("info").innerHTML = "源:"+$("source").value.length + ",值:" + $("result").value.length + ",压缩比" + ($("result").value.length / $("source").value.length).toFixed(3);
}
function doit2(){
    $("source").value = $("chkSE").checked?(eval($("result").value.substring(4))):(lzw_decompress($("result").value));
}
function Binary(initData, p, l, bl){
    var data=initData&&initData.constructor==Array?initData.slice():[], p=p|0, l=l|0, bl=Math.max((bl||8)|0,1), mask=m(bl), _m = 0xFFFFFFFF; //数据,指针,长度,位长度,遮罩
    this.data = function(index, value){ if(!isNaN(value))data[index]=(value|0)||0; if(!isNaN(index))return data[index];else return data.slice(); }
   
    this.read = function(){
        var re;
        if(p >= l)return 0;
        if(32 - (p % 32) < bl){
            re = (((data[p>>5] & m(32 - (p%32))) << ((p+bl)%32)) | (data[(p>>5)+1]>>>(32 - ((p+bl)%32)))) & mask;
        }else{
            re = (data[p>>5] >>> (32 - (p+bl)%32)) & mask;
        }
        p+=bl;
        return re;
    }
   
    this.write = function(i){
        var i, hi, li;
        i &= mask;
        if(32 - (l % 32) < bl){
            data[l>>5] |= i >>> (bl - (32 - (l % 32)));
            data[(l>>5)+1] |= (i << (32 - ((l+bl)%32))) & _m;
        }else{
            data[l>>5] |= (i << (32 - ((l+bl)%32))) & _m;
        }
        l += bl;
    }
   
    this.eof = function(){ return p >= l; }
   
    this.reset = function(){ p=0; mask=m(bl); }
    this.resetAll = function(){ data=[]; p=0; l=0; bl=8; mask=m(bl); _m = 0xFFFFFFFF; }
   
    this.setBitLength = function(len){
        bl = Math.max(len|0, 1);
        mask=m(bl);
    }
   
    this.toHexString = function(){
        var re = [];
        for(var i=0; i<data.length; i++){
            if(data[i] < 0){
                re.push(pad((data[i]>>>16).toString(16), 4) + pad((data[i] & 0xFFFF).toString(16), 4));
            }else{
                re.push(pad(data[i].toString(16), 8));
            }
        }
        return re.join("");
    }
   
    this.toBinaryString = function(){
        var re = [];
        for(var i=0; i<data.length; i++){
            if(data[i] < 0){
                re.push(pad((data[i]>>>1).toString(2), 31) + (data[i] & 1));
            }else{
                re.push(pad(data[i].toString(2), 32));
            }
        }
        return re.join("").substring(0, l);
    }
   
    this.toCString = function(){
        var _p = p, _bl = bl, re = [];
        this.setBitLength(13);
        this.reset();
        while(p < l)re.push(C(this.read()));
        this.setBitLength(_bl);
        p = _p;
        return C(l>>>13) + C(l & m(13)) + re.join("");
    }
   
    this.fromCString = function(str){
        this.resetAll();
        this.setBitLength(13);
        for(var i=2; i<str.length; i++)this.write(D(str, i));
        l = (D(str, 0) << 13) | (D(str, 1) & m(13));
        return this;
    }
   
    this.clone = function(){ return new Binary(data, p, l, bl); }
    function m(len){ return (1<<len)-1; }
    function pad(s, len){ return (new Array(len+1)).join("0").substring(s.length) + s; }
    function C(i){ return String.fromCharCode(i + 0x4e00); }
    function D(s, i){ return s.charCodeAt(i) - 0x4e00; }
}
function lzw_compress(str){
    var b = new Binary(), code_index = -1, char_len = 8;
    var str = str.replace(/[\u0100-\uFFFF]/g, function(s){
        return "\&\#u"+pad(s.charCodeAt(0).toString(16), 4)+";";
    });
    var dic = {}, cp = [], cpi, bl = 8;
    b.setBitLength(bl);
    for(var i=0; i<(1<<char_len)+2; i++)dic[i] = ++code_index;
    cp[0] = str.charCodeAt(0);
    for(var i=1; i<str.length; i++){
        cp[1] = str.charCodeAt(i);
        cpi = (cp[0]<<16) | cp[1];
        if(dic[cpi]==undefined){
            dic[cpi] = (++code_index);
            if(cp[0] > m(bl)){ b.write(0x80); b.setBitLength(++bl); }
            b.write(cp[0]);
            cp[0] = cp[1];
        }else{
            cp[0] = dic[cpi];
        }
    }
    b.write(cp[0]);
    function pad(s, len){ return (new Array(len+1)).join("0").substring(s.length) + s; }
    function m(len){ return (1<<len)-1; }
    return b.toCString();
}

function lzw_decompress(s){var b = new function(){var d=[],p=0,l=0,L=13,k=m(L),_m=0xFFFFFFFF;this.r=function(){var r;if(32-(p%32)<L)r=(((d[p>>5]&m(32-(p%32)))<<((p+L)%32))|(d[(p>>5)+1]>>>(32-((p+L)%32))))&k;else r=(d[p>>5]>>>(32-(p+L)%32))&k;p+=L;return r;};this.w=function(i){i&=k;if(32-(l%32)<L){d[l>>5]|=i>>>(L-(32-(l%32)));d[(l>>5)+1]|=(i<<(32-((l+L)%32)))&_m;}else d[l>>5]|=(i<<(32-((l+L)%32)))&_m;l+=L;};this.e=function(){return p>=l;};this.l=function(len){L=Math.max(len|0, 1);k=m(L);};function m(len){return (1<<len)-1;}function pad(s,l){return (new Array(l+1)).join("0").substring(s.length)+s;}for(var i=2;i<s.length;i++)this.w(s.charCodeAt(i)-0x4e00);l=((s.charCodeAt(0)-0x4e00)<<13)|((s.charCodeAt(1)-0x4e00)&m(13));p=0;};var R=[],C=-1,D={},P=[],L=8;for(i=0; i<(1<<L)+2; i++)D[i]=String.fromCharCode(++C);b.l(L);P[0]=b.r();while(!b.e()){P[1]=b.r();if(P[1]==0x80){ b.l(++L); P[1]=b.r();}if(D[P[1]]==undefined)D[++C]=D[P[0]]+D[P[0]].charAt(0);else D[++C]=D[P[0]]+D[P[1]].charAt(0);R.push(D[P[0]]);P[0]=P[1];}R.push(D[P[0]]);return R.join("").replace(/\&\#u[0-9a-fA-F]{4};/g,function(w){return String.fromCharCode(parseInt(w.substring(3, 7),16));});}
function lzw_decompress_origin(str){
    var b = new Binary();
    b.fromCString(str);
    b.reset();
    var result = [], dic_code = -1;
    var dic={},cp=[], bl = 8;
    for(i=0; i<(1<<bl)+2; i++)dic[i] = String.fromCharCode(++dic_code); //init the dic
    b.setBitLength(bl);
    cp[0]=b.read();
    while(!b.eof()){
        cp[1]=b.read();
        if(cp[1] == 0x80){ b.setBitLength(++bl); cp[1]=b.read(); }
        if(dic[cp[1]]==undefined)dic[++dic_code]=dic[cp[0]]+dic[cp[0]].charAt(0);
        else dic[++dic_code]=dic[cp[0]]+dic[cp[1]].charAt(0);
        result.push(dic[cp[0]]);
        cp[0]=cp[1];
    }
    result.push(dic[cp[0]]);
    return result.join("").replace(/\&\#u[0-9a-fA-F]{4};/g,function(w){
        return String.fromCharCode(parseInt(w.substring(3, 7),16));
    });
}
</SCRIPT>
</head>
<body >
<textarea id="source"></textarea>
<textarea id="result"></textarea>
<br/>
<br/>
<input type="button" value="Compress" onclick="doit();" />
<input type="button" value="DeCompress" onclick="doit2();" />
<input type="checkbox" id="chkSE" /><label for="chkSE">压缩为自解压格式</label>
<span id="info"></span>
</body>
</html>


目录
打赏
0
0
0
0
1393
分享
相关文章
内网网管软件中基于 Node.js 的深度优先搜索算法剖析
内网网管软件在企业网络中不可或缺,涵盖设备管理、流量监控和安全防护。本文基于Node.js实现深度优先搜索(DFS)算法,解析其在网络拓扑遍历中的应用。通过DFS,可高效获取内网设备连接关系,助力故障排查与网络规划。代码示例展示了图结构的构建及DFS的具体实现,为内网管理提供技术支持。
42 11
基于 Node.js 深度优先搜索算法的上网监管软件研究
在数字化时代,网络环境呈现出高度的复杂性与动态性,上网监管软件在维护网络秩序与安全方面的重要性与日俱增。此类软件依托各类数据结构与算法,实现对网络活动的精准监测与高效管理。本文将深度聚焦于深度优先搜索(DFS)算法,并结合 Node.js 编程语言,深入剖析其在上网监管软件中的应用机制与效能。
22 6
Javascript常见算法详解
本文介绍了几种常见的JavaScript算法,包括排序、搜索、递归和图算法。每种算法都提供了详细的代码示例和解释。通过理解这些算法,你可以在实际项目中有效地解决各种数据处理和分析问题。
57 21
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
基于问题“如何监控局域网内的电脑”——Node.js 的 ARP 扫描算法实现局域网内计算机监控的技术探究
在网络管理与安全领域,监控局域网内计算机至关重要。本文探讨基于Node.js的ARP扫描算法,通过获取IP和MAC地址实现有效监控。使用`arp`库安装(`npm install arp`)并编写代码,可定期扫描并对比设备列表,判断设备上线和下线状态。此技术适用于企业网络管理和家庭网络安全防护,未来有望进一步提升效率与准确性。
41 8
深度剖析:共享文件怎么设置密码和权限的 Node.js 进阶算法
在数字化时代,共享文件的安全性至关重要。本文聚焦Node.js环境,介绍如何通过JavaScript对象字面量构建数据结构管理文件安全信息,包括使用`bcryptjs`库加密密码和权限校验算法,确保高效且安全的文件共享。通过实例代码展示加密与权限验证过程,帮助各行业实现严格的信息资产管理与协作。
局域网网络管控里 Node.js 红黑树算法的绝妙运用
在数字化办公中,局域网网络管控至关重要。红黑树作为一种自平衡二叉搜索树,凭借其高效的数据管理和平衡机制,在局域网设备状态管理中大放异彩。通过Node.js实现红黑树算法,可快速插入、查找和更新设备信息(如IP地址、带宽等),确保网络管理员实时监控和优化网络资源,提升局域网的稳定性和安全性。未来,随着技术融合,红黑树将在网络管控中持续进化,助力构建高效、安全的局域网络生态。
66 9
基于生物地理算法的MLP多层感知机优化matlab仿真
本程序基于生物地理算法(BBO)优化MLP多层感知机,通过MATLAB2022A实现随机数据点的趋势预测,并输出优化收敛曲线。BBO模拟物种在地理空间上的迁移、竞争与适应过程,以优化MLP的权重和偏置参数,提升预测性能。完整程序无水印,适用于机器学习和数据预测任务。
基于LSB最低有效位的音频水印嵌入提取算法FPGA实现,包含testbench和MATLAB对比
本项目展示了一种基于FPGA的音频水印算法,采用LSB(最低有效位)技术实现版权保护与数据追踪功能。使用Vivado2019.2和Matlab2022a开发,完整代码含中文注释及操作视频。算法通过修改音频采样点的最低有效位嵌入水印,人耳难以察觉变化。然而,面对滤波或压缩等攻击时,水印提取可能受影响。该项目运行效果无水印干扰,适合实时应用场景,核心逻辑简单高效,时间复杂度低。

热门文章

最新文章