0

这是一个我稍作修改的函数来解码编码文件。

# 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 次尝试解码编码字符串时才会发生一次。

有谁知道我该如何解决这个问题或者是什么原因造成的?

4

1 回答 1

2

$key必须是一个字符串(或能够被杂耍成一个)。任何其他类型,它都会抛出该错误。您正在检查 boolfalse是好的,但它也可能是true, null, object, array,等等。

于 2012-06-18T19:48:29.680 回答