PHP读取BT文件的代码之改进版
10月 21, 2006 on 12:25 am | In 未分类 |今天再看了一下bt文件的具体编码方式 ,又改进了一下代码,几乎是重写了,这次能读入所有信息到数组了,并且字典中的数组进行了一些配对。
- <?php
- $file="铁血.torrent";
- $fp=fopen($file,"rb");
- $data=(readBt($fp));
- /**
- @author renlu xu <helloasp@hotmail.com>
- 输出读入的数组。
- */
- print_r($data);
- /**
- @function readbt 读入bt文件;
- @param $fp 文件指针
- @param $nowtype:当然的元数据类型
- @return Array 一个保存当前元数据集的数组
- */
- function readBt($fp,$nowtype="DICT")
- {
- $nowindex="";
- while(!feof($fp))
- {
- $char=(string)fread($fp,1);
- /**
- 其实仔细研究一下,可能这里几个case的摆放位置,比如哪个在前哪个在后,对速度都是有影响的,不过咱们暂时不管它
- */
- switch($char)
- {
- case "1":
- case "2":
- case "3":
- case "4":
- case "5":
- case "6":
- case "7":
- case "8":
- case "9":
- case "0":
- {
- $nowindex.=$char;
- break;
- }
- case ":":
- {
- $nowtype="STRING";
- $string=fread($fp,intval($nowindex));
- $VARS[]=$string;
- $nowindex="";
- $nowtype="";
- break;
- }
- case "i":
- {
- $nowtype="NUMBER";
- break;
- }
- case "e":
- {
- /**
- e是一个编码结束的标志,要看当前是何种编码。如果是number,直接保存当前读入的一系统数组;如果是列表(list)或字典(dictionary),则返回数组。
- */
- switch ($nowtype)
- {
- case "NUMBER":
- $VARS[]=intval($nowindex);
- $nowindex="";
- break;
- case "LIST":
- return $VARS;
- break;
- case "DICT":
- return $VARS;
- break;
- }
- break;
- }
- /**
- 当开始一个列表或字典时,我为了让结果数组更清晰地显示目录关系,使用了递归。也可以不使用递归。
- */
- case "l":
- {
- $nowtype="LIST";
- $VARS[]=readBt($fp,$nowtype);
- break;
- }
- case "d":
- {
- $nowtype="DICT";
- $VARS[]=readBt($fp,$nowtype);
- break;
- }
- }
- }
- return $VARS;
- }
- fclose($fp);
- ?>
结果还可以用函数再处理一下,不过这个就比较简单了。解析出来后,就能比较容易地读取bt文件并分析当前该种子里的文件名,发布者和节点信息。
大学那会儿特想弄清bt文件的结构,现在知道了,反不想去细了解了。
No Comments yet »
发表评论
Powered by WordPress with Pool theme design by Borja Fernandez.
Entries and comments feeds.
Valid XHTML and CSS. ^Top^