Расшифровать торрент-хэш торрент-трекера?

Я использую BEncoded PHP Library для декодирования закодированного ответа от трекера Bittorrent.

Ответ трекера:

d5:filesd20:¼€™rÄ2ÞÊþVA  .]á^¦d8:completei285e10:downloadedi22911e10:incompletei9eeee

после декодирования, используя следующий код:

require 'bencoded.php';

$be = new BEncoded;
//Response saved in scrape.txt
$data =file_get_contents('scrape.txt');
print_r($be->Decode($data));

выход:

Array ( [files] => Array ( [¼€™rÄ2ÞÊþVA  .]á^¦] => Array ( [complete] => 285 [downloaded] => 22911 [incomplete] => 9 [isDct] => 1 ) [isDct] => 1 ) [isDct] => 1 )

Моя проблема Моя проблема в приведенном выше выводе заключается в том, как декодировать эти загадочные буквы в выводе.

2 ответа

Решение

Ссылка: http://wiki.vuze.com/w/Scrape опубликованная пользователем 3690414, в значительной степени объясняет, что означают различные ключи.

Чтобы интерпретировать необработанную закодированную строку:

d5:filesd20:¼€™rÄ2ÞÊþVA  .]á^¦d8:completei285e10:downloadedi22911e10:incompletei9eeee

вам нужно понять, как работает bencoding: https://wiki.theory.org/BitTorrentSpecification

Здесь важно знать, что каждая запись в словаре с закодированными значениями является парой ключ, значение.
Где ключ является байтовой строкой
и Значение одного из следующих типов: байтовая строка, целое число, список или словарь.

Имея это в виду, необработанную строку можно разбить следующим образом:

d               // The first d indicates the start of the Root dictionary
 5:files            // that has a Key with a 5 byte string name 'files',
  d                     // the value of the 'files'-key is a second dictionary
   20:¼€™rÄ2ÞÊþVA  .]á^¦    // that has a Key 20 byte = 160 bit big endian SHA1 info-hash
    d                       // the value of that key is a third dictionary
     8:complete                 // that has a Key with a 8 byte string name 'complete',
      i285e                         // the value of that key is a Integer=285
     10:downloaded              // that has a Key with a 10 byte string name 'downloaded',
      i22911e                       // the value of that key is a Integer=22911
     10:incomplete              // that has a Key with a 10 byte string name 'incomplete',
      i9e                           // the value of that key is a Integer=9
    e                       // this e indicates the end of the third dictionary
  e                     // this e indicates the end of the second dictionary
e               // this e indicates the end of the Root dictionary

Надеюсь, что это поможет понять вывод "bencoded.php".

редактировать.
Если вы хотите создать 160-битный байтовый инфо-хэш SHA1 [r € rÄ2ÞÊþVA .] Á ^¦]
для более удобочитаемого восприятия, я предлагаю вам вывести его в виде 40-байтовой шестнадцатеричной строки:
0xBC801B9D9972C432DECAFE56410F092E5DE15EA6

Если вы имеете в виду искалеченный ключ files массив, то это сырой infohash - посмотрите спецификацию:

Другие вопросы по тегам