美國留學選擇什么專業(yè)好?留學美國熱門專業(yè)推薦
2019-06-26
更新時間:2023-05-13 16:42作者:網(wǎng)友發(fā)布
我寫了一段python代碼,根據(jù) .torrent文件 中的內容驗證 下載文件 的哈希值。假設您要檢查下載是否損壞,則可能會發(fā)現(xiàn)此功能有用。 __
您需要benpre包才能使用它。Benpre是.torrent文件中使用的序列化格式。它可以封送列表,字典,字符串和數(shù)字,就像JSON。
該代碼采用info[‘pieces’]字符串中包含的哈希值:
torrent_file = open(sys.argv[1], “rb”)metainfo = benpre.bdepre(torrent_file.read())info = metainfo[‘info’]pieces = StringIO.StringIO(info[‘pieces’])
該字符串包含連續(xù)的20個字節(jié)的哈希值(每段一個)。然后,將這些哈希與磁盤文件碎片的哈希進行比較。
此代碼的唯一復雜部分被處理多文件種子因為單個洪流 片 可以跨越多于一個文件 (內部BitTorrent的治療多文件下載作為單個連續(xù)文件)。我正在使用生成器函數(shù)pieces_generator()將其抽象化。
您可能需要閱讀BitTorrent規(guī)范以更詳細地了解這一點。
完整代碼如下:
import sys, os, hashlib, StringIO, benpredef 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.depre(‘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.depre(‘UTF-8’), “rb”) while True: piece = sfile.read(piece_length) if not piece: sfile.close() return yield piecedef 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 = benpre.bdepre(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()