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

本文实例讲述了php读取torrent种子文件内容的方法。分享给大家供大家参考,具体如下:

/**

* 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程序设计有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410970.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

API网关从入门到放弃

前言 假设你正在开发一个电商网站&#xff0c;那么这里会涉及到很多后端的微服务&#xff0c;比如会员、商品、推荐服务等等。 那么这里就会遇到一个问题&#xff0c;APP/Browser怎么去访问这些后端的服务? 如果业务比较简单的话&#xff0c;可以给每个业务都分配一个独立的域…

BarTender操作遇到OLE DB遇到了错误0x80004005”的问题

在使用BarTender打印条码时操作遇到"OLE DB遇到了错误0x80004005”的问题 在打印时关掉数据库所连接的Excel文件即可转载于:https://www.cnblogs.com/edrp/archive/2010/07/18/1780122.html

工作397-Wx

WXSSWXSS (WeiXin Style Sheets)是一套样式语言&#xff0c;用于描述 WXML 的组件样式。WXSS 用来决定 WXML 的组件应该怎么显示。为了适应广大的前端开发者&#xff0c;WXSS 具有 CSS 大部分特性。同时为了更适合开发微信小程序&#xff0c;WXSS 对 CSS 进行了扩充以及修改。与…

震惊!垃圾分类居然能用Python搞定!

目录 0 引言 1 环境 2 需求分析 3 代码实现 4 后记 0 引言 纸巾再湿也是干垃圾&#xff1f;瓜子皮再干也是湿垃圾&#xff1f;&#xff1f;最近大家都被垃圾分类折磨的不行&#xff0c;傻傻的你是否拎得清&#xff1f;???自2019.07.01开始&#xff0c;上海已率先实施垃圾分类…

java中 try用法,Java里try catch的简单用法

优质回答 回答者&#xff1a;temps1991Java里try catch的简单用法&#xff1a;1、trycatch程序的流程是&#xff1a;运行到try块中&#xff0c;如果有异常抛出&#xff0c;则转到catch块去处理。然后执行catch块后面的语句扩展部分&#xff1a;1、trycatchfinally程序的流程是&…

免费试用 Mobile Me

曾经尝试着注册过Mobile me&#xff0c;发现居然试用也要提供信用卡&#xff0c;而且地区选项里根本就没有中国&#xff0c;故愤然弃之。 今天忽然想再尝试一把&#xff0c;毕竟把mac、iphone&#xff0c;和即将到来的ipad连在一起是挺有意思的事情。 打开http://www.apple.com…

php call()函数,PHP中__call()方法详解

前面给大家介绍了《__construct()&#xff0c;类的构造函数》《__destruct()&#xff0c;类的析构函数》&#xff0c;下面继续给大家介绍PHP中__call()方法。__call()&#xff0c;在对象中调用一个不可访问方法时调用。该方法有两个参数&#xff0c;第一个参数 $function_name …

工作398-关于e.currentTarget.dataset的取值。

wxjs代码&#xff1a;GetAction: function (e) {var action e.currentTarget.dataset.action;console.log(action); //father}wxml代码&#xff1a;<view data-action"father" bindtap"GetAction"><image src"https://ss0.baidu.com/6ONWsj…

Postman: Test

Tests 参考&#xff1a;Writing Tests Testing examples 这里写测试用例&#xff0c;进行一些判断等等。即处理断言 下面新建了两个测试用例&#xff0c;名字分别是”Status code is 200“ 、”Status code name has string“。 “responseCode.code 200” 返回 True 或者 Fal…

nginx php怎么配置伪静态,nginx rewrite 伪静态配置参数和使用例子

正则表达式匹配&#xff0c;其中&#xff1a;* ~ 为区分大小写匹配* ~* 为不区分大小写匹配* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配文件及目录匹配&#xff0c;其中&#xff1a;* -f和!-f用来判断是否存在文件* -d和!-d用来判断是否存在目录* -e和!-e用来判断是否…

工作399-openType=“getUserInfo“ lang=“zh_CN“ bindgetuserinfo=“getUserInfo“

获取用户信息组件介绍组件变化&#xff1a;open-type 属性增加 getUserInfo &#xff1a;用户点击时候会触发 bindgetuserinfo 事件。新增事件 bindgetuserinfo &#xff1a;当 open-type 为 getUserInfo 时&#xff0c;用户点击会触发。可以从事件返回参数的detail字段中获取到…

比IETEST更好用的浏览器兼容性测试软件[绿色]

Xenocode Browser Sandbox 改变了基于 Windows 的浏览器兼容测试工具的游戏规则&#xff0c;只需点一下鼠标&#xff0c;就会直接打开一堆各式各样的浏览器窗口&#xff0c;你可以在不同版本的 IE, Firefox, Google Chrome, Safari 进行测试。是真正的测试&#xff0c;不是屏幕…

oracle函数 sysdate

【功能】&#xff1a;返回当前日期。 【参数】&#xff1a;没有参数&#xff0c;没有括号 【返回】&#xff1a;日期 【示例】select sysdate hz from dual; 返回&#xff1a;2008-11-5转载于:https://www.cnblogs.com/fanweisheng/p/11119836.html

php守护进程热更新,服务器编程--守护进程

守护(Daemon)进程又叫作“精灵进程”&#xff0c;虽然守护进程这个名字更为常用&#xff0c;但是个人感觉还是精灵进程较为机灵可爱些。服务器进程一般都是守护进程&#xff0c;这类进程的一个显著特点就是无交互地在后台进程。注意&#xff1a;这里所说的无交互并不是说真的不…

打开eclipse出现JVM terminated.Exit Code=-1错误的解决办法

&#xff30;&#xff33;&#xff1a;还有一种情况就是&#xff2a;&#xff36;&#xff2d;版本号太低&#xff0c;这个要重新安装后将&#xff2a;&#xff24;&#xff2b;目录置于&#xff4f;&#xff52;&#xff41;&#xff43;&#xff4c;&#xff45;前面&#xf…

【期外】 (一)关于LSH :局部敏感哈希算法

LSH是我同学的名字&#xff0c;平时我会亲切的称呼他为离骚&#xff0c;老师好&#xff0c;左移&#xff08;leftshift&#xff09;&#xff0c;小骚骚之类的&#xff0c;最近他又多了一个新的外号&#xff1a;局部敏感哈希&#xff08;Locally sensitive hashing)。 好了&…

java 数据库连接实例,Java连接各种数据库的实例

Java连接各种数据库的实例1、Oracle8/8i/9i数据库(thin模式)以下为引用的内容&#xff1a;Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();String url"jdbc:Oracle:thin:localhost:1521:orcl";//orcl为数据库的SIDString user"test…

python2和python3解释器的区别

python2和python3解释器的区别 1.input的区别 Python2中有raw_input和input. 他的raw_input就相当于Python3中的input,他们把用户输出的数据全部转化为str字符串类型. 他的input让用户输出的是用户输出数据的原始类型,用户输入int类型,他显示的也是int类型,以此类推 2.整型的区…

用于主题检测的临时日志(c48534c5-686f-461e-811f-a15a2f265756 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)...

这是一个未删除的临时日志。请手动删除它。(34a657d4-0fcd-421a-9d75-e80f31602ac5 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)转载于:https://www.cnblogs.com/wangshuai/archive/2010/07/31/1789347.html