到目前为止,我还没有找到任何合适的用javascript编码的.torrent
文件解析器,因此我开始创建我自己的。
到目前为止,我能够在javascript中重新编码php bdecoder,我发现的一个问题是较大的.torrent
文件(如http://www.vuze.com/content/channel.php?id=53&name=Scam%20School%20(Quicktime%20HD中的第二个))有时会导致chrome中的Uncaught RangeError: Maximum call stack size exceeded
错误。是否有一种方法可以让bdecode
函数递归地运行?
随着这个问题,我还没有能够准确地为'生成一个信息哈希。已成功解码的Torrent文件。我对信息字典进行散列,从info
名称之后开始,以e
"结束标记"结束。然而,与实际的bittorrent客户端相比,这会导致不正确的哈希值。我是否错误地读取了文件?
当前代码:http://jsfiddle.net/e23YQ/
谢谢。
使用readAsTest或readAsBinaryString(已弃用)读取种子文件将不足以生成准确的信息哈希。为了尽可能保持原生,必须将文件作为ArrayBuffer
读取,然后使用Uint8Arrays
进行解析。在解析时,保存info字典的开始和结束偏移量以生成info哈希。
为了生成一个准确的信息哈希,你必须使用一个javascript实现的Sha-1,它允许ArrayBuffers
的哈希。鲁沙似乎是个可行的选择。使用Rusha中的digestFromArrayBuffer
和包含info字典的初始ArrayBuffer的切片,我们得到了一个准确的info哈希。
使用ArrayBuffer消除了我之前遇到的stackoverflow问题。
调整后的代码:http://jsfiddle.net/e23YQ/5/