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最初にどちらかの値が false かどうかを確認し、それが false である場合は switch ステートメントから抜け出します。

私が言ったように、これはおそらく、ベンコードされた文字列のデコードを 50 回試行するごとに 1 回しか発生しません。

これを修正する方法や原因を知っている人はいますか?

4

1 に答える 1

2

$key文字列である必要があります(または1つにジャグリングできる)。その他のタイプの場合、そのエラーがスローされます。良いブール値をチェックしていますfalseが、それも可能性がありますtrue, null, object, array

于 2012-06-18T19:48:29.680 に答える