これは、コード化されたファイルをデコードするために少し変更した関数です。
# 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 回しか発生しません。
これを修正する方法や原因を知っている人はいますか?