<html>
<head>
<title>JavaScript字符串之压缩与还原</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript">
<!--
/**
 * 压缩
 */
function Compress(strNormalString) {
    alert("压缩前长度:" + strNormalString.length);
    var strCompressedString = "";

var ht = new Array();
    for(i = 0; i < 128; i++) {
        ht[i] = i;
    }

var used = 128;
    var intLeftOver = 0;
    var intOutputCode = 0;
    var pcode = 0;
    var ccode = 0;
    var k = 0;

for(var i=0; i<strNormalString.length; i++) {
        ccode = strNormalString.charCodeAt(i);
        k = (pcode << 8) | ccode;
        if(ht[k] != null) {
            pcode = ht[k];
        } else {
            intLeftOver += 12;
            intOutputCode <<= 12;
            intOutputCode |= pcode;
            pcode = ccode;
            if(intLeftOver >= 16) {
                strCompressedString += String.fromCharCode( intOutputCode >> ( intLeftOver - 16 ) );
                intOutputCode &= (Math.pow(2, (intLeftOver - 16)) - 1);
                intLeftOver -= 16;
            }
            if(used < 4096) {
                used ++;
                ht[k] = used - 1;
            }
        }
    }

if(pcode != 0) {
        intLeftOver += 12;
        intOutputCode <<= 12;
        intOutputCode |= pcode;
    }

if(intLeftOver >= 16) {
        strCompressedString += String.fromCharCode( intOutputCode >> ( intLeftOver - 16 ) );
        intOutputCode &= (Math.pow(2,(intLeftOver - 16)) - 1);
        intLeftOver -= 16;
    }

if( intLeftOver > 0) {
        intOutputCode <<= (16 - intLeftOver);
        strCompressedString += String.fromCharCode( intOutputCode );
    }

alert("压缩后长度:" + strCompressedString.length);
    return strCompressedString;
}

/**
 * 解压缩
 */
function Decompress(strCompressedString) {
    var strNormalString = "";
    var ht = new Array();

for(i = 0; i < 128; i++) {
        ht[i] = String.fromCharCode(i);
    }

var used = 128;
    var intLeftOver = 0;
    var intOutputCode = 0;
    var ccode = 0;
    var pcode = 0;
    var key = 0;

for(var i=0; i<strCompressedString.length; i++) {
        intLeftOver += 16;
        intOutputCode <<= 16;
        intOutputCode |= strCompressedString.charCodeAt(i);

while(1) {
            if(intLeftOver >= 12) {
                ccode = intOutputCode >> (intLeftOver - 12);
                if( typeof( key = ht[ccode] ) != "undefined" ) {
                     strNormalString += key;
                    if(used > 128) {
                        ht[ht.length] = ht[pcode] + key.substr(0, 1);
                    }
                     pcode = ccode;
                } else {
                    key = ht[pcode] + ht[pcode].substr(0, 1);
                    strNormalString += key;
                    ht[ht.length] = ht[pcode] + key.substr(0, 1);
                    pcode = ht.length - 1;
                }

used ++;
                intLeftOver -= 12;
                intOutputCode &= (Math.pow(2,intLeftOver) - 1);
            } else {
                break;
            }
        }
    }
    return strNormalString;
}
//-->
</script>
</head>
<body>
压缩前:

<input type="text" id="txtNormal" value="" />
<input type="button" value="↓压缩" onclick="document.getElementById('txtCompressed').value=Compress(document.getElementById('txtNormal').value);" />
<input type="button" value="清除" onclick="document.getElementById('txtNormal').value='';" />

压缩后:<br>
<input type="text" id="txtCompressed" value="" />
<input type="button" value="↑解压" onclick="document.getElementById('txtNormal').value=Decompress(document.getElementById('txtCompressed').value);" />
<input type="button" value="清除" onclick="document.getElementById('txtCompressed').value='';" />
</body>
</html>

转载于:https://www.cnblogs.com/liyinkan/archive/2011/09/16/2178686.html

JS Compress and Decompress相关推荐

  1. SQL Server 2016 COMPRESS 和 DECOMPRESS 函数

    SQL Server 2016 COMPRESS 和 DECOMPRESS 函数 英文原文: https://www.simple-talk.com/blogs/2015/12/24/compress ...

  2. 前端代码规范文档(Vue、es6、ts、部分js)

    Vue 开发规范目录及说明 规范目的 命名规范 结构化规范 注释规范 编码规范 CSS 规范 规范目的 为提高团队协作效率,便于后台人员添加功能及前端后期项目有何迭代,以及提高自身代码质量,让大家书写 ...

  3. js和css的命名规范

    笔者在撸代码是也会遇到不知道给元素或变量起什么名字的问题,中文拼音太俗气,随便敲几个字母又影响代码的查读性.于是总结这些命名规范.有些资料来源于网络   一 .css命名规范 1.命名规则说明: 1) ...

  4. Asp.Net使用Yahoo.Yui.Compressor.dll压缩Js|Css

    网上压缩css和js工具很多,但在我们的系统中总有特殊的地方.也许你会觉得用第三方的压缩工具很麻烦.我就遇到了这样问题,我不想在本地压缩,只想更新到服务器上去压缩,服务器压缩也不用备份之类的操作.于是 ...

  5. 混淆js代码--Uglifyjs使用

    混淆js代码–Uglifyjs使用: 首先,全局下载uglify.js npm install uglify-js -g 然后可以写一个js文件,index.js (function () {let ...

  6. JS压缩工具UglifyJS使用

    JS压缩工具UglifyJS使用 简介 使用 UglifyJS的命令格式如下 uglifyjs的options 参考 简介 UglifyJS是个包含JS解释器.代码最小化.压缩.美化的工具集,是前端开 ...

  7. uglify js 代码压缩混淆

    关于 js 压缩混淆 npm install uglify-js -g(不支持 es6语法) npm install uglify-es -g(支持es6语法) 使用命令uglifyjs uglify ...

  8. js函数命名常用动词

    get 获取/set 设置, add 增加/remove 删除 create 创建/destory 移除 start 启动/stop 停止 open 打开/close 关闭, read 读取/writ ...

  9. 通过WebAssembly在移动端解码H.265

    本文转自淘宝技术,文章详细介绍了如何通过WebAssembly在移动Web端实现H.265解码,既享受到了H.265更高的编码效率,又实现了在多种移动端浏览器上兼容.未来,通过WebAssembly还 ...

最新文章

  1. java sha1加密ascii码_请问下面java的Sha1加密在c#中对应要怎么写?
  2. 异常-----Java compiler level does not match解决方法
  3. Nmap/Netcat/Hping3工具对比
  4. 虚指针的用法(原出处//http://blog.csdn.net/haoel/article/details/1948051)
  5. vsftpd 配置说明
  6. 《分布式操作系统》知识点(15~21)三
  7. python小游戏代码_20行python代码的入门级小游戏
  8. php教程链接,php自动给网址加上链接的方法,php网址链接方法_PHP教程
  9. oracle RAC切换归档
  10. 最新软件工程总结,项目模板,软工作业下载
  11. python 字典添加元素乱序了_Python有序字典的两个小“惊喜”
  12. nginx php 没认,NginX没有执行PHP
  13. 提高开发效率的 Eclipse 实用操作
  14. comsol圆柱形永磁体_comsol永磁体仿真
  15. [计算机视觉多视图几何] -- Homography
  16. 性格测试c语言程序,性格测试的题目及答案
  17. 入门须知:次世代3D建模软件有哪些?
  18. eap协议 c语言,CCNP无线技术知识点-EAP和EAPOL协议报文详解
  19. 大众速腾信息公开案11月10日开庭
  20. C++ 简单的CPU使用率监控程序

热门文章

  1. webpack --- html-webpack-plugin
  2. 如果您遇到文件或数据库问题,如何重置Joomla
  3. OC Swift混编-Swift.h File not found
  4. 自己搭建的CISCO实验环境
  5. Vue2 源码漫游(一)
  6. ceph Luminous版手动安装零散记录
  7. Android 虚拟机学习总结Dalvik虚拟机介绍
  8. 调查显示企业对 Linux 开发人才需求日渐增长
  9. 单目视觉标定:世界坐标系、相机坐标系、图像坐标系、像素坐标系——简单粗暴,粗暴
  10. linux下基于jrtplib库的实时传送实现