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 dicb.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" οnclick="doit();" />
<input type="button" value="DeCompress" οnclick="doit2();" />
<input type="checkbox" id="chkSE" /><label for="chkSE">压缩为自解压格式</label>
<span id="info"></span>
</body>
</html>

JS LZW算法压缩与解压相关推荐

  1. Java实现文件压缩与解压[zip格式,gzip格式]

    原文:http://www.cnblogs.com/visec479/p/4112881.html#3069573 Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个 ...

  2. Linux操作系统中,*.zip、*.tar、*.tar.gz、*.tar.bz2、*.tar.xz、*.jar、*.7z等格式的压缩与解压...

    转:http://www.cnblogs.com/yejianfei/archive/2013/10/04/3351626.html zip格式 压缩: zip -r [目标文件名].zip [原文件 ...

  3. python遍历目录压缩文件夹_Python实现多级目录压缩与解压文件的方法

    本文实例讲述了Python实现多级目录压缩与解压文件的方法.分享给大家供大家参考,具体如下: 咱向来就是拿来主意,也发个东西供同行"拿来"使用吧 咱信奉的就是少量的代码完成大量的工 ...

  4. java gzip 解压文件_Java实现文件压缩与解压[zip格式,gzip格式]

    原文:http://www.cnblogs.com/visec479/p/4112881.html#3069573 Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个 ...

  5. 按压缩格式整理打包(解包)和压缩(解压)命令

    文章目录 一.zip 格式 (一)使用命令 zip 压缩文件 (二)使用命令 unzip 解压 zip 包 二.tar 格式 (一)打包文件 (二)解包 tar 包 三.tar.gz 格式 方式一:利 ...

  6. linux 常用压缩格式,Linux常见压缩格式之压缩与解压

    Linux常见压缩格式之压缩与解压 zip格式 压缩:zip -r [目标文件名].zip [原文件/目录名] 解压:unzip [原文件名].zip 注:-r参数代表递归 # Extract arc ...

  7. 利用huffman编码对文本文件进行压缩与解压(java实现)

    利用huffman编码对文本文件进行压缩与解压 输入:一个文本文件 输出:压缩后的文件 算法过程: (1)统计文本文件中每个字符的使用频度 (2)构造huffman编码 (3)以二进制流形式压缩文件 ...

  8. java文件压缩与解压_Java实现文件压缩与解压

    Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个文件和任意级联文件夹进行压缩和解压,对于一些初学者来说是个很不错的实例.(转载自http://www.puiedu. ...

  9. java tar.gz 格式多文件打包压缩与解压

    问题背景:开发中,我们时常会遇到对文件进行存储或传输的问题,但如果传输储存的文件较大,浪费磁盘空间不说,还会大大影响程序运行效率.于是便引出了这篇文章的主题,关于文件打包与压缩的问题.这里" ...

最新文章

  1. vba去oracle数据后乱码,vba中读取utf-8文件乱码问题
  2. 60岁代码匠的几篇小作文,解决了大多数程序的迷茫(下)
  3. ASP.NET(一):Reques对象和Response对象的区别,以及IsPostBack属性的用法
  4. CentOS下开启mysql远程连接,远程管理数据库
  5. oracle的工具cmd,数据库命令行工具DBCLI
  6. 今天学习了无序列表和有序列表和使用HTML5创建表格
  7. 零基础带你学习MySQL—查询数据库(二)
  8. idea导入tomcat源码
  9. golang的https服务器
  10. r 语言初学者指南_自然语言处理初学者指南
  11. mongovue 导入mysql_MongoVUE简单操作手册
  12. 光线追踪渲染技术能听懂的介绍
  13. 怎么解决在微信中不能直接下载APP(APK)的方案
  14. Java中的IO整理
  15. centos安装Nvidia显卡驱动(3090)
  16. 浏览器显示DNS服务器可能不可用,浏览器打不开显示dns
  17. 麦兜搞it python_一位大牛整理的python资源(转)
  18. TcpDump使用手册
  19. CCProcxy代理服务器的配置使用
  20. 同步和异步有什么区别,分别在什么场景下使用

热门文章

  1. Windows Forms:在C#中将图像转换成灰度图
  2. AdaBoost 算法:回归问题
  3. 迎新:Apache IoTDB喜迎1位PMC和4位Committer
  4. [CTO札记]架构改造(SOBS)4原则
  5. Java接入支付宝支付(alipay)
  6. 报销流程太慢太复杂?区块链技术引入票据系统效率翻一倍
  7. 1987. 粉刷栅栏
  8. 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-986 藏匿的刺客
  9. nginx和php的分开部署
  10. 数据库——子查询和多表查询