无法理解JSend中LZW解压缩的php函数

时间:2012-10-30 22:04:06

标签: php javascript compression lzw

我正在尝试将LZW解压缩器从php中的JSend转换为javascript,并且我已经找到了一个我无法理解的功能。

 private static function decompressLZW($aCodes) 
  {
    $sData = '';
    $oDictionary = range("\x0000", "\xff");
    foreach ($aCodes as $sKey => $iCode) 
    {
      $sElement = $oDictionary[$iCode]; 
      if (!isset($sElement))
          $sElement = $sWord . $sWord[0];
      $sData .= $sElement;
      if ($sKey)
          $oDictionary[] = $sWord . $sElement[0];
      $sWord = $sElement;
    }
    return $sData;
  }

这是我到目前为止在javascript中所拥有的,但是当我在javascript中运行它时,它抱怨sWord没有定义并查看php函数,我看不出这是怎么回事产生错误?

到目前为止,这是我在javscript中的内容:

function decompressLZW(aCodes) {
  var sData = '';
  var oDictionary = [];

  for (var i = 0; i < 256; i++) {
    oDictionary[String.fromCharCode(i)] = i; 
  }

  for(var i=0, iLn = aCodes.length; i < iLn; i++) {
    var sElement = oDictionary[aCodes[i]];

    if(!sElement) {
      sElement = sWord + sWord[0];
    }

    //some magic needs to happen here
  }

  return sData;
}

1 个答案:

答案 0 :(得分:1)

那是一种不好的IMO,但.... $sWord本质上是$sElement,它是在迭代结束时定义的。他们指望前两个if语句仅在循环的至少一次运行之后才为真,在这种情况下$sWord将与前一次迭代的$sElement相同。

我不确定这个假设的重要性是什么,但如果是我,我仍会测试$sWord的存在,如果发生这种情况就会抛出异常(即使它理论上从未发生过)......

所以你需要弄清楚为什么sElement = oDictionary[aCodes[i]];没有评估真实的东西。它可能就像测试angainst undefined(更像是做isset())而不是进行松散的假检查一样简单。

if(sElement === undefined) {
  sElement = sWord + sWord[0];
}