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


Posted in PHP onMay 03, 2016

本文实例讲述了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 相关文章推荐
PHP模拟SQL Server的两个日期处理函数
Oct 09 PHP
PHP4实际应用经验篇(6)
Oct 09 PHP
PHP中的extract的作用分析
Apr 09 PHP
PHP5中使用DOM控制XML实现代码
May 07 PHP
shopex主机报错误请求解决方案(No such file or directory)
Dec 27 PHP
PHP使用PHPMailer发送邮件的简单使用方法
Nov 12 PHP
php遍历文件夹所有文件子文件夹函数代码
Nov 27 PHP
php读取纯真ip数据库使用示例
Jan 26 PHP
php使用ob_flush不能每隔一秒输出原理分析
Jun 02 PHP
Laravel SQL语句记录方式(推荐)
May 26 PHP
几行代码轻松实现PHP文件打包下载zip
Mar 01 PHP
PHP CURL实现模拟登陆并上传文件操作示例
Jan 02 PHP
Yii2 输出xml格式数据的方法
May 03 #PHP
php面向对象值单例模式
May 03 #PHP
php使用ffmpeg获取视频信息并截图的实现方法
May 03 #PHP
Linux环境下php实现给网站截图的方法
May 03 #PHP
PHPExcel笔记, mpdf导出
May 03 #PHP
PHP实现的进度条效果详解
May 03 #PHP
php实现按天数、星期、月份查询的搜索框
May 02 #PHP
You might like
PHP ? EasyUI DataGrid 资料存的方式介绍
2012/11/07 PHP
完美解决thinkphp验证码出错无法显示的方法
2014/12/09 PHP
php版微信返回用户text输入的方法
2016/11/14 PHP
php mysql实现mysql_select_db选择数据库
2016/12/30 PHP
PHP合并数组函数array_merge用法分析
2017/02/17 PHP
PHP设计模式之建造者模式定义与用法简单示例
2018/08/13 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
2019/06/25 PHP
纯JavaScript实现的完美渐变弹出层效果代码
2010/04/02 Javascript
javascript工具库代码
2012/03/29 Javascript
JavaScript动态添加style节点的方法
2015/06/09 Javascript
高效的jquery数字滚动特效
2015/12/17 Javascript
如何用JavaScript实现动态修改CSS样式表
2016/05/20 Javascript
浅谈Angular.js中使用$watch监听模型变化
2017/01/10 Javascript
js 数字、字符串、布尔值的转换方法(必看)
2017/04/07 Javascript
详解前端路由实现与react-router使用姿势
2017/08/07 Javascript
微信小程序实现点击按钮修改字体颜色功能【附demo源码下载】
2017/12/05 Javascript
JS数组求和的常用方法实例小结
2019/01/07 Javascript
js实现时钟定时器
2020/03/26 Javascript
Vue实现小购物车功能
2020/12/21 Vue.js
使用Python生成随机密码的示例分享
2016/02/18 Python
详解Django中间件的5种自定义方法
2018/07/26 Python
python爬取网易云音乐评论
2018/11/16 Python
在Pycharm terminal中字体大小设置的方法
2019/01/16 Python
django 消息框架 message使用详解
2019/07/22 Python
Python完全识别验证码自动登录实例详解
2019/11/24 Python
python多进程下的生产者和消费者模型
2020/05/07 Python
3分钟看懂Python后端必须知道的Django的信号机制
2020/07/26 Python
Douglas意大利官网:购买香水和化妆品
2020/05/27 全球购物
电子专业自荐信
2014/07/01 职场文书
企业党的群众路线教育实践活动学习心得体会
2014/10/31 职场文书
面试感谢信范文
2015/01/22 职场文书
2015年新学期寄语
2015/02/26 职场文书
学校教代会开幕词
2016/03/04 职场文书
Go 在 MongoDB 中常用查询与修改的操作
2021/05/07 Golang
html5调用摄像头截图功能
2022/01/18 Javascript
vue特效之翻牌动画
2022/04/20 Vue.js