| 
 | 
 
 
            本文实例讲述了php读取torrent种子文件内容的方法。分享给大家供大家参考,具体如下: 
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 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 = 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数组(Array)操作技巧大全》、《PHP数学运算技巧总结》、《PHP图形与图片操作技巧汇总》、《php操作office文档技巧总结(包括word,excel,access,ppt)》、《php日期与时间用法总结》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》 
希望本文所述对大家PHP程序设计有所帮助。 
             
             
您可能感兴趣的文章:php读取二进制流(C语言结构体struct数据文件)的深入解析PHP文件锁定写入实例解析PHP程序中的文件锁、互斥锁、读写锁使用技巧解析php进行ip地址掩码运算处理的方法THinkPHP获取客户端IP与IP地址查询的方法php读取qqwry.dat ip地址定位文件的类实例代码PHP批量获取网页中所有固定种子链接的方法php正则提取html图片(img)src地址与任意属性的方法PHP基于新浪IP库获取IP详细地址的方法PHP实现将优酷土豆腾讯视频html地址转换成flash swf地址的方法PHP基于闭包思想实现的BT(torrent)文件解析工具实例详解 
         |   
 
 
 
 |