0
这里有一个功能,我修改了一点解码bencoded文件。PHP中的静态函数仅有时会返回一个错误(Illegal Offset Type)?
# decode a bencoded string
public static function decode($s, &$pos = 0) {
if($pos >= strlen($s)) {
return false;
}
switch($s[$pos]) {
case 'd':
++$pos;
$retval = array();
while(isset($s[$pos]) && $s[$pos] != 'e') {
$key = self::decode($s, $pos);
$val = self::decode($s, $pos);
if($key == false || $val == false) {
break;
}
$retval[$key] = $val; // ERROR OCCURES HERE
}
$retval['isDct'] = true;
++$pos;
return $retval;
case 'l':
++$pos;
$retval = array();
while(isset($s[$pos]) && $s[$pos] != 'e') {
$val = self::decode($s, $pos);
if($val == false) {
break;
}
$retval[] = $val;
}
++$pos;
return $retval;
case 'i':
++$pos;
$digits = strpos($s, 'e', $pos) - $pos;
$val = (int)substr($s, $pos, $digits);
$pos += $digits + 1;
return $val;
default:
$digits = strpos($s, ':', $pos) - $pos;
if($digits < 0 || $digits > 20) {
return false;
}
$len = (int)substr($s, $pos, $digits);
$pos += $digits + 1;
$str = substr($s, $pos, $len);
$pos += $len;
return (string)$str;
}
return false;
}
你会注意到我已经评论了错误发生的地方;
Illegal offset type
我不知道这是怎么发生,虽然作为分配$retval[$key] = $val
之前我检查,看看是否任一值是假的第一和如果再从switch语句打破。
就像我说过的,这只发生在解码经过编码的字符串时每50次尝试一次。
任何人都知道如何解决这个问题或者是什么原因造成的?
感谢这一点,我只是假设,因为该函数只能返回'假',那就是它可能是因为它是递归地调用。 – Griff
@Mike B +1为头像!战争从未改变! –