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

5年以前  |  阅读数:861 次  |  编程语言:PHP 

本文实例讲述了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相关内容感兴趣的读者可查看本站专题:《PHP数组(Array)操作技巧大全》、《PHP数学运算技巧总结》、《PHP图形与图片操作技巧汇总》、《php操作office文档技巧总结(包括word,excel,access,ppt)》、《php日期与时间用法总结》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总

希望本文所述对大家PHP程序设计有所帮助。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例