当前位置:首页 > PHP教程 > php高级应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2019-08-12 11:48:48 浏览: 评论:0 

本文实例讲述了php读取torrent种子文件内容的方法。分享给大家供大家参考,具体如下:

  1. <?php 
  2.  
  3. /** 
  4.  
  5.  * Class xBEncoder 
  6.  
  7.  * Author: Angus.Fenying 
  8.  
  9.  * Version: 0.1 
  10.  
  11.  * Date:  2014-06-03 
  12.  
  13.  * 
  14.  
  15.  *  This class helps stringify or parse BENC 
  16.  
  17.  *  codes. 
  18.  
  19.  * 
  20.  
  21.  * All Copyrights 2007 - 2014 Fenying Studio Reserved. 
  22.  
  23.  */ 
  24.  
  25. class xBEncoder 
  26.  
  27.  
  28.   const READY = 0; 
  29.  
  30.   const READ_STR = 1; 
  31.  
  32.   const READ_DICT = 2; 
  33.  
  34.   const READ_LIST = 3; 
  35.  
  36.   const READ_INT = 4; 
  37.  
  38.   const READ_KEY = 5; 
  39.  
  40.   public $y
  41.  
  42.   protected $z$m$n
  43.  
  44.   protected $stat
  45.  
  46.   protected $stack
  47.  
  48.   /** 
  49.  
  50.    * This method saves the status of current 
  51.  
  52.    * encode/decode work. 
  53.  
  54.    */ 
  55.  
  56.   protected function push($newY$newStat
  57.  
  58.   { 
  59.  
  60.     array_push($this->stack, array($this->y, $this->z, $this->m, $this->n, $this->stat)); 
  61.  
  62.     list($this->y, $this->z, $this->m, $this->n, $this->stat) = array($newY, 0, 0, 0, $newStat); 
  63.  
  64.   } 
  65.  
  66.   /** 
  67.  
  68.    * This method restore the saved status of current 
  69.  
  70.    * encode/decode work. 
  71.  
  72.    */ 
  73.  
  74.   protected function pop() 
  75.  
  76.   { 
  77.  
  78.     $t = array_pop($this->stack); 
  79.  
  80.     if ($t) { 
  81.  
  82.       if ($t[4] == self::READ_DICT) { 
  83.  
  84.         $t[0]->{$t[1]} = $this->y; 
  85.  
  86.         $t[1] = 0; 
  87.  
  88.       } elseif ($t[4] == self::READ_LIST) 
  89.  
  90.         $t[0][] = $this->y; 
  91.  
  92.       list($this->y, $this->z, $this->m, $this->n, $this->stat) = $t
  93.  
  94.     } 
  95.  
  96.   } 
  97.  
  98.   /** 
  99.  
  100.    * This method initializes the status of work. 
  101.  
  102.    * YOU SHOULD CALL THIS METHOD BEFORE EVERYTHING. 
  103.  
  104.    */ 
  105.  
  106.   public function init() 
  107.  
  108.   { 
  109.  
  110.     $this->stat = self::READY; 
  111.  
  112.     $this->stack = array(); 
  113.  
  114.     $this->z = $this->m = $this->n = 0; 
  115.  
  116.   } 
  117.  
  118.   /** 
  119.  
  120.    * This method decode $s($l as length). 
  121.  
  122.    * You can get $obj->y as the result. 
  123.  
  124.    */ 
  125.  
  126.   public function decode($s$l
  127.  
  128.   { 
  129.  
  130.     $this->y = 0; 
  131.  
  132.     for ($i = 0; $i < $l; ++$i) { 
  133.  
  134.       switch ($this->stat) { 
  135.  
  136.         case self::READY: 
  137.  
  138.           if ($s[$i] == 'd') { 
  139.  
  140.             $this->y = new xBDict(); 
  141.  
  142.             $this->stat = self::READ_DICT; 
  143.  
  144.           } elseif ($s[$i] == 'l') { 
  145.  
  146.             $this->y = array(); 
  147.  
  148.             $this->stat = self::READ_LIST; 
  149.  
  150.           } 
  151.  
  152.           break
  153.  
  154.         case self::READ_INT: 
  155.  
  156.           if ($s[$i] == 'e') { 
  157.  
  158.             $this->y->val = substr($s$this->m, $i - $this->m); 
  159.  
  160.             $this->pop(); 
  161.  
  162.           } 
  163.  
  164.           break
  165.  
  166.         case self::READ_STR: 
  167.  
  168.           if (xBInt::isNum($s[$i])) 
  169.  
  170.             continue
  171.  
  172.           if ($s[$i] = ':') { 
  173.  
  174.             $this->z = substr($s$this->m, $i - $this->m); 
  175.  
  176.             $this->y = substr($s$i + 1, $this->z + 0); 
  177.  
  178.             $i += $this->z; 
  179.  
  180.             $this->pop(); 
  181.  
  182.           } 
  183.  
  184.           break
  185.  
  186.         case self::READ_KEY: 
  187.  
  188.           if (xBInt::isNum($s[$i])) 
  189.  
  190.             continue
  191.  
  192.           if ($s[$i] = ':') { 
  193.  
  194.             $this->n = substr($s$this->m, $i - $this->m); 
  195.  
  196.             $this->z = substr($s$i + 1, $this->n + 0); 
  197.  
  198.             $i += $this->n; 
  199.  
  200.             $this->stat = self::READ_DICT; 
  201.  
  202.           } 
  203.  
  204.           break
  205.  
  206.         case self::READ_DICT: 
  207.  
  208.           if ($s[$i] == 'e') { 
  209.  
  210.             $this->pop(); 
  211.  
  212.             break
  213.  
  214.           } elseif (!$this->z) { 
  215.  
  216.             $this->m = $i
  217.  
  218.             $this->stat = self::READ_KEY; 
  219.  
  220.             break
  221.  
  222.           } 
  223.  
  224.         case self::READ_LIST: 
  225.  
  226.           switch ($s[$i]) { 
  227.  
  228.             case 'e'
  229.  
  230.               $this->pop(); 
  231.  
  232.               break
  233.  
  234.             case 'd'
  235.  
  236.               $this->push(new xBDict(), self::READ_DICT); 
  237.  
  238.               break
  239.  
  240.             case 'i'
  241.  
  242.               $this->push(new xBInt(), self::READ_INT); 
  243.  
  244.               $this->m = $i + 1; 
  245.  
  246.               break
  247.  
  248.             case 'l'
  249.  
  250.               $this->push(array(), self::READ_LIST); 
  251.  
  252.               break
  253.  
  254.             default
  255.  
  256.               if (xBInt::isNum($s[$i])) { 
  257.  
  258.                 $this->push('', self::READ_STR); 
  259.  
  260.                 $this->m = $i
  261.  
  262.               } 
  263.  
  264.           } 
  265.  
  266.           break
  267.  
  268.       } 
  269.  
  270.     } 
  271.  
  272.     $rtn = emptyempty($this->stack); 
  273.  
  274.     $this->init(); 
  275.  
  276.     return $rtn
  277.  
  278.   } 
  279.  
  280.   /** 
  281.  
  282.    * This method encode $obj->y into BEncode. 
  283.  
  284.    */ 
  285.  
  286.   public function encode() 
  287.  
  288.   { 
  289.  
  290.     return $this->_encDo($this->y); 
  291.  
  292.   } 
  293.  
  294.   protected function _encStr($str
  295.  
  296.   { 
  297.  
  298.     return strlen($str) . ':' . $str
  299.  
  300.   } 
  301.  
  302.   protected function _encDo($o
  303.  
  304.   { 
  305.  
  306.     if (is_string($o)) 
  307.  
  308.       return $this->_encStr($o); 
  309.  
  310.     if ($o instanceof xBInt) 
  311.  
  312.       return 'i' . $o->val . 'e'
  313.  
  314.     if ($o instanceof xBDict) { 
  315.  
  316.       $r = 'd'
  317.  
  318.       foreach ($o as $k => $c
  319.  
  320.         $r .= $this->_encStr($k) . $this->_encDo($c); 
  321.  
  322.       return $r . 'e'
  323.  
  324.     } 
  325.  
  326.     if (is_array($o)) { 
  327.  
  328.       $r = 'l'
  329.  
  330.       foreach ($o as $c
  331.  
  332.         $r .= $this->_encDo($c); 
  333.  
  334.       return $r . 'e'
  335.  
  336.     } 
  337.  
  338.   } 
  339.  
  340.  
  341. class xBDict 
  342.  
  343.  
  344.  
  345. class xBInt 
  346.  
  347.  
  348.   public $val
  349.  
  350.   public function __construct($val = 0) 
  351.  
  352.   { 
  353.  
  354.     $this->val = $val
  355.  
  356.   } 
  357.  
  358.   public static function isNum($chr
  359.  
  360.   { 
  361.  
  362.     $chr = ord($chr); 
  363.  
  364.     if ($chr <= 57 && $chr >= 48) 
  365.  
  366.       return true; 
  367.  
  368.     return false; 
  369.  
  370.   } 
  371.  
  372.  
  373. //使用实例 
  374.  
  375. $s = file_get_contents("test.torrent"); 
  376. //phpfensi.com 
  377. $bc = new xBEncoder(); 
  378.  
  379. $bc->init(); 
  380.  
  381. $bc->decode($sstrlen($s)); 
  382.  
  383. var_dump($bc->y); 

Tags: php读取torrent

分享到: