这是一个我稍作修改的函数来解码编码文件。
# 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 次尝试解码编码字符串时才会发生一次。
有谁知道我该如何解决这个问题或者是什么原因造成的?