本文实例讲述了PHP读取torrent种子文件内容的方法。分享给大家供大家参考,具体如下:
PHP;">
stack,array($this->y,$this->z,$this->m,$this->n,$this->stat));
list($this->y,$this->stat) = array($newY,$newStat);
}
/**
* This method restore the saved status of current
* encode/decode work.
*/
protected function pop()
{
$t = array_pop($this->stack);
if ($t) {
if ($t[4] == self::READ_DICT) {
$t[0]->{$t[1]} = $this->y;
$t[1] = 0;
} elseif ($t[4] == self::READ_LIST)
$t[0][] = $this->y;
list($this->y,$this->stat) = $t;
}
}
/**
* This method initializes the status of work.
* YOU SHOULD CALL THIS METHOD BEFORE EVERYTHING.
*/
public function init()
{
$this->stat = self::READY;
$this->stack = array();
$this->z = $this->m = $this->n = 0;
}
/**
* This method decode $s($l as length).
* You can get $obj->y as the result.
*/
public function decode($s,$l)
{
$this->y = 0;
for ($i = 0; $i < $l; ++$i) {
switch ($this->stat) {
case self::READY:
if ($s[$i] == 'd') {
$this->y = new xBDict();
$this->stat = self::READ_DICT;
} elseif ($s[$i] == 'l') {
$this->y = array();
$this->stat = self::READ_LIST;
}
break;
case self::READ_INT:
if ($s[$i] == 'e') {
$this->y->val = substr($s,$i - $this->m);
$this->pop();
}
break;
case self::READ_STR:
if (xBInt::isNum($s[$i]))
continue;
if ($s[$i] = ':') {
$this->z = substr($s,$i - $this->m);
$this->y = substr($s,$i + 1,$this->z + 0);
$i += $this->z;
$this->pop();
}
break;
case self::READ_KEY:
if (xBInt::isNum($s[$i]))
continue;
if ($s[$i] = ':') {
$this->n = substr($s,$i - $this->m);
$this->z = substr($s,$this->n + 0);
$i += $this->n;
$this->stat = self::READ_DICT;
}
break;
case self::READ_DICT:
if ($s[$i] == 'e') {
$this->pop();
break;
} elseif (!$this->z) {
$this->m = $i;
$this->stat = self::READ_KEY;
break;
}
case self::READ_LIST:
switch ($s[$i]) {
case 'e':
$this->pop();
break;
case 'd':
$this->push(new xBDict(),self::READ_DICT);
break;
case 'i':
$this->push(new xBInt(),self::READ_INT);
$this->m = $i + 1;
break;
case 'l':
$this->push(array(),self::READ_LIST);
break;
default:
if (xBInt::isNum($s[$i])) {
$this->push('',self::READ_STR);
$this->m = $i;
}
}
break;
}
}
$rtn = empty($this->stack);
$this->init();
return $rtn;
}
/**
* This method encode $obj->y into BEncode.
*/
public function encode()
{
return $this->_encDo($this->y);
}
protected function _encStr($str)
{
return strlen($str) . ':' . $str;
}
protected function _encDo($o)
{
if (is_string($o))
return $this->_encStr($o);
if ($o instanceof xBInt)
return 'i' . $o->val . 'e';
if ($o instanceof xBDict) {
$r = 'd';
foreach ($o as $k => $c)
$r .= $this->_encStr($k) . $this->_encDo($c);
return $r . 'e';
}
if (is_array($o)) {
$r = 'l';
foreach ($o as $c)
$r .= $this->_encDo($c);
return $r . 'e';
}
}
}
class xBDict
{
}
class xBInt
{
public $val;
public function __construct($val = 0)
{
$this->val = $val;
}
public static function isNum($chr)
{
$chr = ord($chr);
if ($chr <= 57 && $chr >= 48)
return true;
return false;
}
}
//使用实例
$s = file_get_contents("test.torrent");
$bc = new xBEncoder();
$bc->init();
$bc->decode($s,strlen($s));
var_dump($bc->y);
更多关于PHP相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》、《》、《》、《》及《PHP常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
原文链接:https://www.f2er.com/php/19885.html