我正在尝试将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;
}
答案 0 :(得分:1)
那是一种不好的IMO,但.... $sWord
本质上是$sElement
,它是在迭代结束时定义的。他们指望前两个if语句仅在循环的至少一次运行之后才为真,在这种情况下$sWord
将与前一次迭代的$sElement
相同。
我不确定这个假设的重要性是什么,但如果是我,我仍会测试$sWord
的存在,如果发生这种情况就会抛出异常(即使它理论上从未发生过)......
所以你需要弄清楚为什么sElement = oDictionary[aCodes[i]];
没有评估真实的东西。它可能就像测试angainst undefined
(更像是做isset()
)而不是进行松散的假检查一样简单。
if(sElement === undefined) {
sElement = sWord + sWord[0];
}