2012-02-29 56 views
1

我几乎完全用我的torrent服务器完成。我现在所要做的就是了解.torrent文件如何填充信息键的“件”键。创建torrent文件时计算(sha1)“件”

我目前有这个信息在我的torrent文件中,编码为u​​tf-8格式。最后看到的散列是文件TITLE的哈希,甚至不接近我在冒号前指定的位长。对于个位长,采用(文件大小/片长)* 20计算,并采用圆()四舍五入:

d8:announce64:http://www.valevarkasystems.com:40/torrents/tracker/announce.php 

8:encoding5:UTF-84:infod6:lengthi71711042e4:name25:Executive Meeting480p.flv 

12:piece lengthi128000e6:pieces11205:òOìcØq¬rkÑzÎõyjZee 

如何正确计算值末尾的“碎片”键?

每次我尝试在传输中打开它时,它都被读为已损坏。

我是否使用fopen(),抓取一段“片段长度”的文件,并为每个片段创建一个sha1散列,直到到达文件末尾?

谢谢,

+0

http://wiki.theory.org/BitTorrentSpecification#Info_Dictionary – 2012-02-29 21:16:02

+0

@Marc Brown你有没有看过BEncode/BDecode的PHP源代码,如果你喜欢,我可以发布这两个类 – 2012-02-29 21:27:38

+0

@MarcB我发现/是多次提到这个页面,我忘记了我有三个标签打开它。我明白他们希望我散列每个文件,即file_get_contents(),其中maxlen是我的piece_length的大小?我认为这就是我必须要做的,但我不确定。 – 2012-02-29 21:57:58

回答

2

是的。您从文件读取piece size字节数,通过SHA-1独立运行每个片段。生成的20字节SHA-1摘要就是你的作品,它被放置在作品串中作为二进制

如果您使用fopen()来读取数据,请确保以二进制模式打开文件(即指定“b”作为模式)。否则,只要在字节流中遇到\ n,运行时可能会插入\ r。

您应该以(filesize + piece_length - 1)/piece_length结尾,其数量乘以20即为您的pieces字符串的长度。

它看起来像你只使用单个文件种子。多文件洪流案件更加复杂。你基本上必须想象洪流中的所有文件被连接起来以形成从一个片段到一个文件和偏移量的映射。

+0

感谢您的提示。我刚刚阅读了关于使用二进制标志的可移植性。但是,我仍然使用“file_get_contents”...... – 2012-03-16 14:04:18