2 Star 2 Fork 0

Egist/smbbs

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
BDecode.php 3.32 KB
一键复制 编辑 原始数据 按行查看 历史
Egist 提交于 2016-09-03 01:08 . 0.0.1
<?php
class BDecode {
function numberdecode($wholefile, $offset) {
// Funky handling of negative numbers and zero
$negative = false;
if ($wholefile[$offset] == '-') {
$negative = true;
$offset++;
}
if ($wholefile[$offset] == '0') {
$offset++;
if ($negative)
return array(false);
if ($wholefile[$offset] == ':' || $wholefile[$offset] == 'e')
return array(0, ++$offset);
return array(false);
}
$ret[0] = 0;
for(;;) {
if ($wholefile[$offset] >= '0' && $wholefile[$offset] <= '9') {
$ret[0] *= 10;
//Added 2005.02.21 - VisiGod
//Changing the type of variable from integer to double to prevent a numeric overflow
settype($ret[0],'double');
//Added 2005.02.21 - VisiGod
$ret[0] += ord($wholefile[$offset]) - ord('0');
$offset++;
} else if ($wholefile[$offset] == 'e' || $wholefile[$offset] == ':') {
// Tolerate : or e because this is a multiuse function
$ret[1] = $offset+1;
if ($negative) {
if ($ret[0] == 0)
return array(false);
$ret[0] = - $ret[0];
}
return $ret;
} else return array(false);
}
}
function decodeEntry($wholefile, $offset=0) {
if ($wholefile[$offset] == 'd')
return $this->decodeDict($wholefile, $offset);
if ($wholefile[$offset] == 'l')
return $this->decodelist($wholefile, $offset);
if ($wholefile[$offset] == 'i')
return $this->numberdecode($wholefile, ++$offset);
// String value: decode number, then grab substring
$info = $this->numberdecode($wholefile, $offset);
if ($info[0] === false)
return array(false);
$ret[0] = substr($wholefile, $info[1], $info[0]);
$ret[1] = $info[1]+strlen($ret[0]);
return $ret;
}
function decodeList($wholefile, $offset) {
if ($wholefile[$offset] != 'l')
return array(false);
$offset++;
$ret = array();
for ($i=0;;$i++) {
if ($wholefile[$offset] == 'e')
break;
$value = $this->decodeEntry($wholefile, $offset);
if ($value[0] === false)
return array(false);
$ret[$i] = $value[0];
$offset = $value[1];
}
// The empty list is an empty array. Seems fine.
return array(0=>$ret, 1=>++$offset);
}
// Tries to construct an array
function decodeDict($wholefile, $offset=0) {
if ($wholefile[$offset] == 'l')
return $this->decodeList($wholefile, $offset);
if ($wholefile[$offset] != 'd')
return false;
$ret=array();
$offset++;
for (;;) {
if ($wholefile[$offset] == 'e') {
$offset++;
break;
}
$left = $this->decodeEntry($wholefile, $offset);
if (!$left[0])
return false;
$offset = $left[1];
if ($wholefile[$offset] == 'd') {
// Recurse
$value = $this->decodedict($wholefile, $offset);
if (!$value[0])
return false;
$ret[addslashes($left[0])] = $value[0];
$offset= $value[1];
continue;
}
if ($wholefile[$offset] == 'l') {
$value = $this->decodeList($wholefile, $offset);
if (!$value[0] && is_bool($value[0]))
return false;
$ret[addslashes($left[0])] = $value[0];
$offset = $value[1];
continue;
}
$value = $this->decodeEntry($wholefile, $offset);
if ($value[0] === false)
return false;
$ret[addslashes($left[0])] = $value[0];
$offset = $value[1];
}
return array(0=>(empty($ret)?true:$ret), 1=>$offset);
}
}
function BDecode($wholefile) {
$decoder = new BDecode;
$return = $decoder->decodeEntry($wholefile);
return $return[0];
}
?>
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
PHP
1
https://gitee.com/supercell/smbbs.git
[email protected]:supercell/smbbs.git
supercell
smbbs
smbbs
master

搜索帮助