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 相关文章推荐
数据库相关问题
Oct 09 PHP
在WINDOWS中设置计划任务执行PHP文件的方法
Dec 19 PHP
PHP 第一节 php简介
Apr 28 PHP
php生成略缩图代码
Jul 16 PHP
PHP无限分类(树形类)的深入分析
Jun 02 PHP
php获取字符串中各个字符出现次数的方法
Feb 23 PHP
php检索或者复制远程文件的方法
Mar 13 PHP
php禁用cookie后session设置方法分析
Oct 19 PHP
PHP用户注册邮件激活账户的实现代码
May 31 PHP
PHP判断当前使用的是什么浏览器(推荐)
Oct 27 PHP
PHP实现Markdown文章上传到七牛图床的实例内容
Feb 11 PHP
php7 参数、整形及字符串处理机制修改实例分析
May 25 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
Javascript创建自定义对象 创建Object实例添加属性和方法
2012/06/04 Javascript
nodejs中使用多线程编程的方法实例
2015/03/24 NodeJs
JavaScript更改字符串的大小写
2015/05/07 Javascript
HTML5使用DeviceOrientation实现摇一摇功能
2015/06/05 Javascript
JavaScript对Cookie进行读写操作实例
2015/07/25 Javascript
jquery实现带缩略图的可定制高度画廊效果(5种)
2015/08/28 Javascript
AngularJS基础教程之简单介绍
2015/09/27 Javascript
jQuery ajax时间差导致的变量赋值问题分析
2016/01/22 Javascript
全面解析JavaScript中“&amp;&amp;”和“||”操作符(总结篇)
2016/07/18 Javascript
hovertree插件实现二级树形菜单(简单实用)
2016/12/28 Javascript
Bootstrap轮播图学习使用
2017/02/10 Javascript
jQuery实现弹幕效果
2017/02/17 Javascript
基于HTML5+JS实现本地图片裁剪并上传功能
2017/03/24 Javascript
深入理解Node中的buffer模块
2017/06/03 Javascript
webpack中CommonsChunkPlugin详细教程(小结)
2017/11/09 Javascript
JS实现的集合去重,交集,并集,差集功能示例
2018/03/13 Javascript
使用Angular CLI快速创建Angular项目的一些基本概念和写法小结
2018/04/22 Javascript
在vue中使用公共过滤器filter的方法
2018/06/26 Javascript
javascript中contains是否包含功能实现代码(扩展字符、数组、dom)
2020/04/07 Javascript
uniapp,微信小程序中使用 MQTT的问题
2020/07/11 Javascript
在vscode 中设置 vue模板内容的方法
2020/09/02 Javascript
[50:12]EG vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python 字符串大小写转换的简单实例
2017/01/21 Python
使用python的pandas库读取csv文件保存至mysql数据库
2018/08/20 Python
详解如何将python3.6软件的py文件打包成exe程序
2018/10/09 Python
Python读写csv文件流程及异常解决
2020/10/20 Python
台湾屈臣氏网路商店:Watsons台湾
2020/12/29 全球购物
软件测试企业面试试卷
2016/07/13 面试题
关于对大人不礼貌的检讨书
2014/09/29 职场文书
夫妻忠诚协议书范本
2014/11/17 职场文书
反腐倡廉观后感
2015/06/08 职场文书
服务行业标语口号
2015/12/26 职场文书
matplotlib之pyplot模块实现添加子图subplot的使用
2021/04/25 Python
解决SpringBoot文件上传临时目录找不到的问题
2021/07/01 Java/Android
Python中的pprint模块
2021/11/27 Python
2022年显卡天梯图(6月更新)
2022/06/17 数码科技