0

我正在尝试将 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;
}
4

1 回答 1

1

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

我不确定这个假设的意义是什么,但如果是我,我仍然会测试是否存在$sWord并在发生这种情况时抛出异常(即使理论上它不应该发生)......

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

if(sElement === undefined) {
  sElement = sWord + sWord[0];
}
于 2012-10-30T22:12:33.227 回答