php教程

超轻量级php框架startmvc

php读取torrent种子文件内容的方法(测试可用)

更新时间:2020-03-09 00:48:59 作者:startmvc
本文实例讲述了php读取torrent种子文件内容的方法。分享给大家供大家参考,具体如下:<&

本文实例讲述了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 = 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 读取 torrent 种子文件