PHP打包/解包错误

3

我需要将旧系统中的一些“加密”数据转换为现代加密算法。以下是代码:

 function unpackString($s,$l){
      $tmp=unpack('c'.$l,$s);
      $return=NULL;
      foreach($tmp as $v){
          if($v>0){
              $return.=chr($v);
          }
      }
      return $return;
  }
  function packString($s,$l){
      $return=NULL;
      for($i=0;$i<$l;$i++){
          $return.=pack('c',ord(substr($s,$i,1)));
      }
      return $return;
  }

  $string='StackOverflow Is AWESOME';
  $l=strlen($string);

  $encoded=packString(base64_encode($string),$l);
  $decoded=base64_decode(unpackString($encoded,$l));


  echo "\n".$decoded."\n";

为什么输出显示为StackOverflow Is A而不是StackOverflow Is AWESOME

你的空格键坏了吗? - ken
考虑使用"c*"而不是试图在其中硬编码长度。如果您知道整个字符串将被传递进来,最好告诉它处理整个字符串。 - Mr. Llama
1个回答

12

base64编码会使字符串的大小增加约33%。您传入的是原始字符串的长度,而不是base64编码后的长度:

StackOverflow Is AWESOME  - 24 chars plaintext
U3RhY2tPdmVyZmxvdyBJcyBBV0VTT01F - 32 chars base64 encoded

所以你要去掉8个字符,剩下的就是

U3RhY2tPdmVyZmxvdyBJcyBB

它的意思是解码为

StackOverflow Is A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接