突然就想要解析了。。代码写的好乱。
想起来以前GIF图片使用的LZW的编码我还没写完解析呢。。近期大概也会写的吧。。
解析了一个7k的,在我这已经算小的种子文件了。
└─dictionary
├─string:announce
├─string:http://tracker.ktxp.com:6868/announce
├─string:announce-list
├─list
├─string:created by
├─string:BitComet/1.25
├─string:creation date
├─string:1301449953
├─string:encoding
├─string:UTF-8
├─string:info
├─dictionary
├─string:nodes
└─list
第一个list里的内容是这样的:
<list>
<list>
string:http://tracker.ktxp.com:7070/announce
</list>
<list>
string:http://tracker.ktxp.com:6868/announce
</list>
</list>
大概明白是怎么一回事了。
虽然好像这东西跟json很像?没注意过哪里有这个跟json的比较.
不过这东西有点太傻了。。它唯一的好处就是不像json那样,解析起来传统上需要分2部,词法分析和语法分析。
bencode的解码基本上完全可以把2步合起来。。
总之,种子文件的根节点是一个字典。
字典里面的第一个映射是由announce映射到一个主tracker
然后是由announce-list映射到一个列表,列表的内容是一个由tracker服务器组成的表。
字典里面剩下的内容是created by信息,creation date信息,encoding信息,info信息。
前2个的内容都是字符串,info信息是一个字典。
info字典的第一个内容就是files。
files的内容是一个列表,列表中每一个元素都是字典。
这些字典中的每一个当然都是对文件的描述。
有以下这些描述:
ed2k,filehash,length,path,path.utf-8
由于根字典下有:
string:encoding
string:UTF-8
所以这里的path.utf-8和path的值是一样的。
刚刚说到info字典的一个对象,files列表
info字典还有以下对象:
name,name.utf-8,piece length,pieces
说起这个pieces对象我就觉得囧。
所以说,这B编码的字符串根本不是字符串嘛。其实是字节流吧。
像filehash这样的东西都用字符串表示,不觉得很奇怪吗?理论上来说filehash应该是一个整数。
当然,更不济的情况下应该是一个由整数组成的列表。
算了,以后我懂了,不能把B编码中的字符串类型看成是C字符串,把它看做char型数组还差不多。
而pieces。。哎。。
说完info字典,根字典下还有最后一个对象是nodes列表。。这个列表的内容都是列表,里面是由一个其实标识着数字的字符串和一个整数0组成的。
你看,又把字符串和整数混着用了。。
刚刚看到一个好贴:
http://hi.baidu.com/52taoist/blog/item/7ada6a5ea0a6934ffaf2c0fa.html