创建洪流哈希信息(Create torrent hash info)

2019-08-03 11:15发布

如何生成的torrent文件洪流哈希信息。

我一直在考虑这个例子来看看: 如何计算使用Java洪流的哈希值 ,我试图将其转换为C ++。 这是我到目前为止的代码:

void At::ReadTorrent::TorrentParser::create_hash(std::string torrentstub)
{
    std::string info;
    int counter = 0;

    while(info.find("4:info") == -1)
    {
        info.push_back(torrentstub[counter]);
        counter++;
    }

    unsigned char array[torrentstub.size()];
    int test = 0;

    for(int data; (data = torrentstub[counter]) > -1;)
    {
         array[test++] = data;
         counter++;
    }
    std::cout << array << std::endl;

    //SHA-1 some value here to generate the hash.
}

所述torrentstub参数是表示为字符串种子文件。 据我了解我必须得到被后传来的信息4:info 。 这工作好,我认为,例如:

d6:lengthi2847431620e4:name8:filename12:piece lengthi1143252e6:pieces50264

这事以后,是我不能只读信息,我想这是一些二进制数据?

所以我的问题实际上可以归结为:是应该被散列后到来的一切信息4:info ,和我应该在哪里停下来哈希收集数据?

Answer 1:

您可以根据此示例代码似乎承担信息关键是在torrent文件的最后一件事(它可能不是,所以读一个完整的答案让整个故事)。 因此,它会覆盖文件(减去1个字节)的剩余部分开始后的字节“:信息”。 你会看到类似“...:infod6:长......”。 该SHA1开头“D6:长......”,并转到文件减去1个字节的末尾(最后一个字节,通常是“E”,是不包括在内)。

例如,如果torrent文件是43125个字节“:信息”从偏移362,那么SHA数据偏移量367开始,并继续抵消43123(即,它是42757个字节)。

你可能知道你的torrent文件确实与信息键结束。 如果你不知道,那么你的算法应该是有点更复杂。 torrent文件是B编码和信息键由bencode“字典”的(搜索维基百科bencode和阅读article--这是很容易理解)。 该“d”是继“:信息”开始与一个“e”结尾的字典。 字典的长度没有编码,所以知道的唯一出路在哪里结束,直到你找到“E”重圆解析的内容。 如果该文件被正确格式化的词典的内容将包括一系列格式良好的B编码元件(以及进一步嵌套元素)组成。 最终你会发现一个“e”(而不是其他元素的元素)结束后。 这个“E”结尾的字典。 的SHA1是移到该词典的全部内容,包括开口“d”和闭合的“e”。 这是可能的其他B编码要素遵循这一点。 这些都是不包含在SHA1计算。

杂项。 笔记:

假设信息密钥文件(再次,它可能不是),也就是在你的算法SHA-1的“冷落”的单字节中的最后一件事是最后的“E”为整个洪流(这仅仅是一个单bencode dictionary--所有种子文件开头“d”,并以“E”)结束。

这是二进制数据,所以你灌torrentstub []时,必须把它读作这样。

你不能测试-1,以确定何时结束,你在你的例子做。 它的代码是在读操作的结果为-1(EOF)进行测试时,根据长相,而不是数据本身。 您必须使用torrent文件的长度,减去数据的开始(后“:信息”)减去1得到正确的长度。

你居然参考示例代码读取的最后一个字节,但生成SHA1时排除。

一个字节,复制读取字符串,然后再重复扫描的字符串是非常低效的。 你已经拥有的数据在阵列中,所以只要使用的strstr(从一开始就是ASCII数据)或自己扫描它(因为它是一个很短的,固定长度的字符串不是太难,只是代码它)。

我假设你有一些代码来完成实际的SHA1。 什么平台你的工作吗?



Answer 2:

该规范的.torrent是免费提供的 ,应该帮助你理解文件格式很容易。 所有你需要做的是SHA1的内容info键进入信息哈希值。



文章来源: Create torrent hash info