<?php 
    $file="铁血.torrent"; 
    $fp=fopen($file,"rb"); 
    $data=(readBt($fp)); 
    /** 
   @author renlu xu <[email protected]
    输出读入的数组。 
    */ 
    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); 
    ?>