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