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 相关文章推荐
玩转图像函数库―常见图形操作
Sep 03 PHP
深入了解php4(1)--回到未来
Oct 09 PHP
php+mysql事务rollback&amp;commit示例
Feb 08 PHP
PHP实现冒泡排序的简单实例
May 26 PHP
php实现购物车功能(以大苹果购物网为例)
Mar 09 PHP
PHP截取发动短信内容的方法
Jul 04 PHP
PHP图片水印类的封装
Jul 06 PHP
Yii2框架可逆加密简单实现方法
Aug 25 PHP
php获取微信共享收货地址的方法
Dec 21 PHP
PHP中PDO事务处理操作示例
May 02 PHP
laravel实现简单用户权限的示例代码
May 28 PHP
php使用redis的几种常见操作方式和用法示例
Feb 20 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
印尼林东PWN黄金曼特宁咖啡豆:怎么冲世界上最醇厚的咖啡冲煮教程
2021/03/03 冲泡冲煮
PHP 危险函数解释 分析
2009/04/22 PHP
PHP简单获取随机数的常用方法小结
2017/06/07 PHP
PHP格式化显示时间date()函数代码
2018/10/03 PHP
jQuery 定时局部刷新(setInterval)
2010/11/19 Javascript
js的表单操作 简单计算器
2011/12/29 Javascript
JavaScript 5 新增 Array 方法实现介绍
2012/02/06 Javascript
js图片自动切换效果处理代码
2013/05/07 Javascript
简单谈谈javascript代码复用模式
2015/01/28 Javascript
原生js与jQuery实现简单的tab切换特效对比
2015/07/30 Javascript
由浅入深讲解Javascript继承机制与simple-inheritance源码分析
2015/12/13 Javascript
JavaScript 冒泡排序和选择排序的实现代码
2016/09/03 Javascript
javascript实现根据汉字获取简拼
2016/09/25 Javascript
bootstrap datepicker 与bootstrapValidator同时使用时选择日期后无法正常触发校验的解决思路
2016/09/28 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
2017/05/17 Javascript
angularjs中ng-bind-html的用法总结
2017/05/23 Javascript
JavaScript订单操作小程序完整版
2017/06/23 Javascript
vue组件学习教程
2017/09/09 Javascript
微信小程序swiper组件用法实例分析【附源码下载】
2017/12/07 Javascript
VUE 实现滚动监听 导航栏置顶的方法
2018/09/11 Javascript
angular inputNumber指令输入框只能输入数字的实现
2019/12/03 Javascript
Vue data的数据响应式到底是如何实现的
2020/02/11 Javascript
javascript实现一款好看的秒表计时器
2020/09/05 Javascript
vue中element 的upload组件发送请求给后端操作
2020/09/07 Javascript
JS数组索引检测中的数据类型问题详解
2021/01/11 Javascript
Python标准库之随机数 (math包、random包)介绍
2014/11/25 Python
TensorFlow用expand_dim()来增加维度的方法
2018/07/26 Python
HTML5 新表单类型示例代码
2018/03/20 HTML / CSS
GAP阿联酋官网:GAP UAE
2017/11/30 全球购物
一些Solaris面试题
2013/03/22 面试题
临床医学大学生求职信
2013/09/28 职场文书
十一国庆节“向国旗敬礼”主题班会活动方案
2014/09/27 职场文书
群众路线查摆问题整改措施思想汇报
2014/10/10 职场文书
精神病医院见习报告
2014/11/03 职场文书
岗位竞聘报告范文
2014/11/06 职场文书
教你使用一行Python代码玩遍童年的小游戏
2021/08/23 Python