本文实例讲述了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程序设计有所帮助。