请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2553|回复: 0

js字符串压缩算法与解压

[复制链接]

821

主题

821

帖子

2663

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2663
发表于 2019-8-30 08:51:58 | 显示全部楼层 |阅读模式
压缩
  1. function Compress(strNormalString) {
  2.     alert("压缩前长度:" + strNormalString.length);
  3.     var strCompressedString = "";

  4.     var ht = new Array();
  5.     for(i = 0; i < 128; i++) {
  6.         ht[i] = i;
  7.     }

  8.     var used = 128;
  9.     var intLeftOver = 0;
  10.     var intOutputCode = 0;
  11.     var pcode = 0;
  12.     var ccode = 0;
  13.     var k = 0;

  14.     for(var i=0; i<strNormalString.length; i++) {
  15.         ccode = strNormalString.charCodeAt(i);
  16.         k = (pcode << 8) | ccode;
  17.         if(ht[k] != null) {
  18.             pcode = ht[k];
  19.         } else {
  20.             intLeftOver += 12;
  21.             intOutputCode <<= 12;
  22.             intOutputCode |= pcode;
  23.             pcode = ccode;
  24.             if(intLeftOver >= 16) {
  25.                 strCompressedString += String.fromCharCode( intOutputCode >> ( intLeftOver - 16 ) );
  26.                 intOutputCode &= (Math.pow(2, (intLeftOver - 16)) - 1);
  27.                 intLeftOver -= 16;
  28.             }
  29.             if(used < 4096) {
  30.                 used ++;
  31.                 ht[k] = used - 1;
  32.             }
  33.         }
  34.     }

  35.     if(pcode != 0) {
  36.         intLeftOver += 12;
  37.         intOutputCode <<= 12;
  38.         intOutputCode |= pcode;
  39.     }

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

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

  49.     alert("压缩后长度:" + strCompressedString.length);
  50.     return strCompressedString;
  51. }
复制代码
解压缩
  1. function Decompress(strCompressedString) {
  2.     var strNormalString = "";
  3.     var ht = new Array();

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

  7.     var used = 128;
  8.     var intLeftOver = 0;
  9.     var intOutputCode = 0;
  10.     var ccode = 0;
  11.     var pcode = 0;
  12.     var key = 0;

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

  17.         while(1) {
  18.             if(intLeftOver >= 12) {
  19.                 ccode = intOutputCode >> (intLeftOver - 12);
  20.                 if( typeof( key = ht[ccode] ) != "undefined" ) {
  21.                      strNormalString += key;
  22.                     if(used > 128) {
  23.                         ht[ht.length] = ht[pcode] + key.substr(0, 1);
  24.                     }
  25.                      pcode = ccode;
  26.                 } else {
  27.                     key = ht[pcode] + ht[pcode].substr(0, 1);
  28.                     strNormalString += key;
  29.                     ht[ht.length] = ht[pcode] + key.substr(0, 1);
  30.                     pcode = ht.length - 1;
  31.                 }

  32.                 used ++;
  33.                 intLeftOver -= 12;
  34.                 intOutputCode &= (Math.pow(2,intLeftOver) - 1);
  35.             } else {
  36.                 break;
  37.             }
  38.         }
  39.     }
  40.     return strNormalString;
  41. }
复制代码
使用
  1. Compress(str)  //压缩
  2. Decompress(str)  //解压
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

用户反馈
客户端