PHP读取BT文件的代码之改进版

10月 21, 2006 on 12:25 am | In 未分类 |

今天再看了一下bt文件的具体编码方式 ,又改进了一下代码,几乎是重写了,这次能读入所有信息到数组了,并且字典中的数组进行了一些配对。

  1. <?php
  2.     $file="铁血.torrent";
  3.     $fp=fopen($file,"rb");
  4.     $data=(readBt($fp));
  5.     /**
  6.    @author renlu xu <helloasp@hotmail.com>
  7.     输出读入的数组。
  8.     */
  9.     print_r($data);
  10.     /**
  11.    @function readbt 读入bt文件;
  12.    @param $fp 文件指针
  13.    @param $nowtype:当然的元数据类型
  14.    @return Array 一个保存当前元数据集的数组
  15.     */
  16.     function readBt($fp,$nowtype="DICT")
  17.     {
  18.         $nowindex="";
  19.         while(!feof($fp))
  20.         {
  21.             $char=(string)fread($fp,1);
  22.             /**
  23.             其实仔细研究一下,可能这里几个case的摆放位置,比如哪个在前哪个在后,对速度都是有影响的,不过咱们暂时不管它
  24.             */
  25.             switch($char)
  26.             {
  27.                 case "1":
  28.                 case "2":
  29.                 case "3":
  30.                 case "4":
  31.                 case "5":
  32.                 case "6":
  33.                 case "7":
  34.                 case "8":
  35.                 case "9":
  36.                 case "0":
  37.                 {
  38.                     $nowindex.=$char;
  39.                     break;
  40.                 }
  41.                 case ":":
  42.                 {
  43.                     $nowtype="STRING";
  44.                     $string=fread($fp,intval($nowindex));
  45.                
  46.                     $VARS[]=$string;
  47.                     $nowindex="";
  48.                     $nowtype="";
  49.                     break;
  50.                 }
  51.                 case "i":
  52.                 {
  53.                
  54.                     $nowtype="NUMBER";
  55.                     break;
  56.                    
  57.                 }   
  58.                 case "e":
  59.                 {
  60.                     /**
  61.                     e是一个编码结束的标志,要看当前是何种编码。如果是number,直接保存当前读入的一系统数组;如果是列表(list)或字典(dictionary),则返回数组。
  62.                     */
  63.                    
  64.                     switch ($nowtype)
  65.                     {
  66.                         case "NUMBER":
  67.                        
  68.                             $VARS[]=intval($nowindex);
  69.                             $nowindex="";
  70.                             break;   
  71.                         case "LIST":
  72.                        
  73.                             return $VARS;
  74.                             break;
  75.                         case "DICT":
  76.                        
  77.                             return $VARS;
  78.                             break;
  79.                     }
  80.                    
  81.                     break;
  82.                 }
  83.                 /**
  84.                 当开始一个列表或字典时,我为了让结果数组更清晰地显示目录关系,使用了递归。也可以不使用递归。
  85.                 */
  86.                 case "l":
  87.                     {
  88.                     $nowtype="LIST";
  89.                     $VARS[]=readBt($fp,$nowtype);
  90.                     break;
  91.                     }
  92.                 case "d":
  93.                 {
  94.                
  95.                     $nowtype="DICT";
  96.                     $VARS[]=readBt($fp,$nowtype);
  97.                     break;
  98.                 }
  99.                
  100.             }   
  101.            
  102.         }
  103.         return $VARS;
  104.     }
  105.     fclose($fp);
  106.    
  107.  
  108. ?>

结果还可以用函数再处理一下,不过这个就比较简单了。解析出来后,就能比较容易地读取bt文件并分析当前该种子里的文件名,发布者和节点信息。
大学那会儿特想弄清bt文件的结构,现在知道了,反不想去细了解了。

No Comments yet »

评论 RSS Feed。 TrackBack URI

发表评论

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Powered by WordPress with Pool theme design by Borja Fernandez.
Entries and comments feeds. Valid XHTML and CSS. ^Top^