微信小程序学习:JS长字符串压缩短字符串与解压。

背景:

在使用微信小程序码的时候发现,动态获取的小程序码携带的参数scene长度限制只能为32位字符,而需要传递的id的长度就达到了32位,再加上一些type就出了限定的32位。故,只能想办法把传递的字符串压缩至32位以下。

代码:

 /* *
  * 压缩
  */ 
function compress(strNormalString) {
  console.log( " 压缩前长度: "   +  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 );
  }

  console.log(strCompressedString+" 压缩后长度: "   +  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 ;
         }
     }
 }
 console.log(" 解压缩后: "   +  strNormalString);
  return  strNormalString;
}

 

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sziitjin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值