php读取torrent种子文件内容的方法(测试可用)
发布:smiling 来源: PHP粉丝网 添加日期:2019-08-12 11:48:48 浏览: 评论:0
本文实例讲述了php读取torrent种子文件内容的方法。分享给大家供大家参考,具体如下:
- <?php
- /**
- * Class xBEncoder
- * Author: Angus.Fenying
- * Version: 0.1
- * Date: 2014-06-03
- *
- * This class helps stringify or parse BENC
- * codes.
- *
- * All Copyrights 2007 - 2014 Fenying Studio Reserved.
- */
- class xBEncoder
- {
- const READY = 0;
- const READ_STR = 1;
- const READ_DICT = 2;
- const READ_LIST = 3;
- const READ_INT = 4;
- const READ_KEY = 5;
- public $y;
- protected $z, $m, $n;
- protected $stat;
- protected $stack;
- /**
- * This method saves the status of current
- * encode/decode work.
- */
- protected function push($newY, $newStat)
- {
- array_push($this->stack, array($this->y, $this->z, $this->m, $this->n, $this->stat));
- list($this->y, $this->z, $this->m, $this->n, $this->stat) = array($newY, 0, 0, 0, $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->z, $this->m, $this->n, $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, $this->m, $i - $this->m);
- $this->pop();
- }
- break;
- case self::READ_STR:
- if (xBInt::isNum($s[$i]))
- continue;
- if ($s[$i] = ':') {
- $this->z = substr($s, $this->m, $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, $this->m, $i - $this->m);
- $this->z = substr($s, $i + 1, $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 = emptyempty($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");
- //phpfensi.com
- $bc = new xBEncoder();
- $bc->init();
- $bc->decode($s, strlen($s));
- var_dump($bc->y);
Tags: php读取torrent
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)