微信小程序学习: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
    评论
微信小程序中,可以使用JavaScript的split()函数来实现字符串的分割。该函数可以接受一个分隔符作为参数,并将字符串分割成一个数组。例如,如果要以空格分割字符串为数组,可以使用以下代码: ```javascript let word = "Hello World" let list = word.split(" ") console.log(list) // 输出 \["Hello", "World"\] ``` 如果只想返回分割后的数组的第一个元素,可以在split()函数的第二个参数中指定返回的元素个数。例如,要返回分割后的数组的第一个元素,可以使用以下代码: ```javascript let word = "Hello World" let list = word.split(" ", 1) console.log(list) // 输出 \["Hello"\] ``` 需要注意的是,以上代码只是示例,实际使用时需要根据具体的需求进行调整。同时,还可以使用正则表达式来进行更复杂的字符串分割操作。 #### 引用[.reference_title] - *1* *2* [微信小程序开发——JS中字符和数组的操作](https://blog.csdn.net/potato512/article/details/125353433)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [【微信小程序+js】分割字符串,把段落拆成句子的实践](https://blog.csdn.net/sinat_41838682/article/details/130342259)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

sziitjin

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

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

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

打赏作者

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

抵扣说明:

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

余额充值