当前位置: 首页 > 面试题库 >

从种子文件中提取SHA1哈希

史同化
2023-03-14
问题内容

我已经到处寻找答案,但是似乎只能找到可以满足您需求的软件。有人知道如何在python中执行此操作吗?


问题答案:

我写了一段python代码,根据 .torrent文件 中的内容验证 下载文件 的哈希值。假设您要检查下载是否损坏,则可能会发现此功能有用。 __

您需要bencode包才能使用它。Bencode是.torrent文件中使用的序列化格式。它可以封送列表,字典,字符串和数字,就像JSON。

该代码采用info['pieces']字符串中包含的哈希值:

torrent_file = open(sys.argv[1], "rb")
metainfo = bencode.bdecode(torrent_file.read())
info = metainfo['info']
pieces = StringIO.StringIO(info['pieces'])

该字符串包含连续的20个字节的哈希值(每段一个)。然后,将这些哈希与磁盘文件碎片的哈希进行比较。

此代码的唯一复杂部分被处理多文件种子因为单个洪流 可以跨越多于一个文件 (内部BitTorrent的治疗多文件下载作为单个连续文件)
。我正在使用生成器函数pieces_generator()将其抽象化。

您可能需要阅读BitTorrent规范以更详细地了解这一点。

完整代码如下:

import sys, os, hashlib, StringIO, bencode

def pieces_generator(info):
    """Yield pieces from download file(s)."""
    piece_length = info['piece length']
    if 'files' in info: # yield pieces from a multi-file torrent
        piece = ""
        for file_info in info['files']:
            path = os.sep.join([info['name']] + file_info['path'])
            print path
            sfile = open(path.decode('UTF-8'), "rb")
            while True:
                piece += sfile.read(piece_length-len(piece))
                if len(piece) != piece_length:
                    sfile.close()
                    break
                yield piece
                piece = ""
        if piece != "":
            yield piece
    else: # yield pieces from a single file torrent
        path = info['name']
        print path
        sfile = open(path.decode('UTF-8'), "rb")
        while True:
            piece = sfile.read(piece_length)
            if not piece:
                sfile.close()
                return
            yield piece

def corruption_failure():
    """Display error message and exit"""
    print("download corrupted")
    exit(1)

def main():
    # Open torrent file
    torrent_file = open(sys.argv[1], "rb")
    metainfo = bencode.bdecode(torrent_file.read())
    info = metainfo['info']
    pieces = StringIO.StringIO(info['pieces'])
    # Iterate through pieces
    for piece in pieces_generator(info):
        # Compare piece hash with expected hash
        piece_hash = hashlib.sha1(piece).digest()
        if (piece_hash != pieces.read(20)):
            corruption_failure()
    # ensure we've read all pieces 
    if pieces.read():
        corruption_failure()

if __name__ == "__main__":
    main()


 类似资料:
  • 我需要从大文件中提取文本(最大限制50MB)文件可能是doc、ppt、xls、txt或pdf格式。到目前为止,我使用了ApachePOI'http://poi.apache.org/' 用于Microsoft Office文档和PDFBox从PDF中提取文本。然而,随着文件变大,提取过程变得缓慢,特别是以下文件。到目前为止我取得的成果: 1. PPTX-45MB-3分钟apx 2.PDF-62MB

  • 如何从CSV文件中提取列? 我对Java有点陌生。你如何从csv文件中提取特定列。例如,如果我有这个数据: 如何提取第一列和第三列?我能够读取整个CSV文件,但我想从中提取特定的列。

  • 我需要解析一些BSOD崩溃文件,但我有一个可怕的混乱与符号。我有成吨的pdb文件,在文件夹下,所以文件夹名是pdb文件GUID,但我相信文件是混乱的。 我所需要做的就是找到从pdb文件中提取GUID的方法。我设法找到了这个工具。但不幸的是,我有错误,不能让它工作。

  • 在我的应用程序中,我下载了Android系统的扩展文件- 我尝试将APK扩展Zip库用作: 但是expansionFile总是空的。这个obb文件是用Jobb创建的,用于文件夹obb/file。拉链

  • 问题内容: 我有一个非常大的.txt文件,其中散布着成千上万个电子邮件地址。它们都采用以下格式: 使Python循环遍历整个.txt文件以查找某个@domain字符串的所有实例,然后在<…>内获取地址的全部并将其添加到的最佳方法是什么?一个列表?我遇到的麻烦是不同地址的长度可变。 问题答案: 此代码以字符串形式提取电子邮件地址。逐行阅读时使用 如果您有多个电子邮件地址,请使用: 上面的正则表达式可

  • 问题内容: 假设您有一个像这样的文本文件:http : //www.gutenberg.org/files/17921/17921-8.txt 有没有人有一个好的算法或开放源代码从文本文件中提取单词?如何获得所有单词,同时避免使用特殊字符,并保留诸如“ it’s”之类的内容… 我在用Java工作。谢谢 问题答案: 这听起来像是正则表达式的正确工作。如果您不知道如何开始,以下是一些Java代码,可以