加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php获取torrent种子文件内容的方法

发布时间:2023-10-09 10:57:46 所属栏目:PHP教程 来源:
导读:本文实例讲述了php读取torrent种子文件内容的方法。分享给大家供大家参考,具体如下:

<?php

/**

* Class xBEncoder

* Author: Angus.Fenying

* Version: 0.1

* Date: 2014-06-03
本文实例讲述了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"); 
//Cuoxin.com 
$bc = new xBEncoder(); 
 
$bc->init(); 
 
$bc->decode($s, strlen($s)); 
 
var_dump($bc->y); 

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章