php - 创建 torrent 文件时计算 (sha1) "pieces"

标签 php hash bittorrent

我的 torrent 服务器即将完全完成。我现在要做的就是找出 .torrent 文件如何填充 info 键的“pieces”键。

目前,我的 torrent 文件中有此信息,以 utf-8 格式编码。您在末尾看到的哈希值是文件标题的哈希值,甚至不接近我在冒号之前指定的位长度。片段的位长度使用(文件大小/片段长度)* 20 计算,并使用 round() 进行舍入:

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

如何正确计算最后“pieces”键的值?

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

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

谢谢

最佳答案

是的。您从文件中读取片段大小字节数,通过 SHA-1 独立运行每个片段。生成的 20 字节 SHA-1 摘要就是您的片段,它以二进制形式放入片段字符串中。

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

您最终应该得到 (filesize +piece_length - 1)/piece_length block 数,乘以 20 就是 pieces 字符串的长度。

看来您只使用单个文件 torrent。多文件 torrent 的情况更为复杂。您本质上必须想象 torrent 中的所有文件被连接起来以形成从片段到文件和偏移量的映射。

关于php - 创建 torrent 文件时计算 (sha1) "pieces",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9506667/

相关文章:

php - Laravel 'sometimes' 验证器因嵌套数组而失败

php - __在 PHP "Cannot use object of type stdClass as array"中获取资源

python - 使用 Python libtorrent 创建守护进程以获取 100k+ 种子的元数据

php - 选择 AD ntSecurityDescriptor 属性作为非管理员

php - css 样式 php 作为函数

ruby - 合并数组中的哈希 [ruby]

ruby - 如果不修改,在迭代之间保留哈希排序?

p2p - BitTorrent Optimistic Unchoke/Bandwith 探测

java - 如何从 Torrent Tracker 获取对等点

php - 删除 PHP 中使用 JavaScript 添加的空间