Структура uTorrent в uTorrentPartFile.dat - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь создать небольшую утилиту, которая должна автоматизировать некоторые задачи обслуживания пула торрентов uTerrent.Чтобы проверить хэши частично загруженных общих ресурсов, мне нужно извлечь части фрагментов, которые не полностью содержатся в загруженных файлах, из файла ~uTorrentPartFile_XXX.dat, где их хранит uTorrent.Возникают два вопроса:

  1. Для определенного файла .torrent, как мне вычислить имя соответствующего файла ~uTorrentPartFile_XXX.dat (а именно, шестнадцатеричную строку, которую uTorrent использует вместо моего XXX)
  2. Где я могу найти информацию о внутренней структуре файла, которая позволила бы мне извлечь из него необходимые данные?Google не смог помочь.

1 Ответ

0 голосов
/ 02 августа 2019

Команда BiglyBT разработала формат ~ uTorrentPartFile_XXXX.dat при создании подключаемого модуля миграции.
https://www.biglybt.com/download/utMigrate
https://github.com/BiglySoftware/BiglyBT-plugin-migratetorrentapp

От: https://github.com/BiglySoftware/BiglyBT-plugin-migratetorrentapp/blob/master/src/com/biglybt/plugins/migratetorrentapp/utorrent/PartFile.java

/**
 * uTorrent partfile
 * Basically, torrent data is split into 64k parts.  Header has 4 byte index for
 * each part, pointing to data if index is > 0.  
 * After the header is the 64k data chunks, first data chunk is 1, second is 2, etc. 
 * Last data chunk may be smaller than 64k.
 * 
 * ~uTorrentPartFile_*<hexsize>*.dat
 *   <Header>, <data>
 *   
 * hexsize
 *   torrent data length in bytes in hex with no leading 0
 *
 * Header
 *   <DataIndex>[<Num64kParts>]
 *   Raw header length = <Num64kParts> * 4
 *
 * Num64kParts
 *   How many parts is required if you split torrent data length into 64k sections. 
 *   ie. Math.ceil(torrent data length in bytes / 64k)
 *
 * DataIndex
 *   4 byte little endian integer.  Values:
 *      0 
 *        No data for this 64k part
 *      1..<num64Parts>
 *        1-based positional index in <data>
 *        Location in part file can be calculated with
 *          (Header Size) + ((value - 1) * 64k)
 *   
 * data
 *   <DataPart>[up to <num64kParts>]
 *   
 * DataPart
 *   64k byte array containing torrent data.  
 *   Bytes in <DataPart> that are stored elsewhere in real files will be 0x00. 
 *   ie. non-skipped files sharing the 64k part will be 0x00. 
 *   Last <DataPart> may be less than 64k, which means the rest of the 64k would
 *   be 0x00 (and part of a non-skipped file)
 *     
 */

Бонус

В комментариях к коду здесь также содержится некоторая полезная информация о содержимом resume.dat и settings.dat :

https://github.com/BiglySoftware/BiglyBT-plugin-migratetorrentapp/blob/master/src/com/biglybt/plugins/migratetorrentapp/utorrent/ResumeConstants.java
https://github.com/BiglySoftware/BiglyBT-plugin-migratetorrentapp/blob/master/src/com/biglybt/plugins/migratetorrentapp/utorrent/SettingsConstants.java

...