2012-02-29 3 views
1

J'ai presque terminé avec mon serveur torrent complètement. Tout ce que j'ai à faire maintenant est de savoir comment les fichiers .torrent remplissent la clé "morceaux" pour la clé info.Calculer (sha1) "morceaux" lors de la création de fichier torrent

J'ai actuellement cette information dans mon fichier torrent, encodé au format utf-8. Le hachage que vous voyez à la fin est un has du TITLE du fichier, pas même proche de la longueur de bit que j'ai spécifiée avant le deux-points. La longueur de bits pour des pièces a été calculé à l'aide (taille du fichier/longueur de pièce) * 20, et arrondi à l'aide ronde():

d8:announce64:http://www.valevarkasystems.com:40/torrents/tracker/announce.php 

8:encoding5:UTF-84:infod6:lengthi71711042e4:name25:Executive Meeting480p.flv 

12:piece lengthi128000e6:pieces11205:òOìcØq¬rkÑzÎõyjZee 

Comment puis-je calculer correctement une valeur de la clé « pièces » à la fin?

Chaque fois que j'essaie de l'ouvrir dans Transmission, il est lu comme corrompu. Est-ce que j'utilise fopen(), saisissez une partie du fichier qui est "longueur de la pièce" et créer un hachage sha1 pour chaque pièce jusqu'à ce que j'atteigne la fin du fichier?

Merci,

+0

http://wiki.theory.org/BitTorrentSpecification#Info_Dictionary –

+0

@Marc Brown avez-vous regardé la source php bencode/BDecode peut-être que cela aiderait, je peux poster les deux classes si vous aimez –

+0

@MarcB j'ai trouvé/était renvoyé cette page tant de fois que j'ai oublié j'avais trois onglets ouverts avec elle. Je comprends qu'ils veulent que je hache chaque pièce de fichier, c'est-à-dire file_get_contents() où le maxlen est la taille de mon morceau_length? Je pense que c'est tout ce que j'ai à faire, mais je ne suis pas sûr. –

Répondre

2

Oui. Vous avez lu piece size nombre d'octets à partir du fichier, exécuter chaque pièce par le biais de SHA-1 indépendamment. Le résultat de 20 octets SHA-1 digest est votre pièce, qui est mis comme binaire dans la chaîne pièces.

Si vous utilisez fopen() pour lire les données, veillez à ouvrir le fichier en mode binaire (c'est-à-dire, spécifiez "b" comme mode). Sinon, votre runtime peut insérer \ r chaque fois qu'il rencontre un \ n dans le flux d'octets.

Vous devriez vous retrouver avec (filesize + piece_length - 1)/piece_length nombre de pièces, multiplicateur par 20 est la longueur de votre chaîne pieces.

Il semble que vous travaillez uniquement avec des torrents à fichier unique. Le cas de torrent multi-fichier est plus compliqué. Vous devez essentiellement imaginer que tous les fichiers du torrent sont concaténés pour former le mappage d'une pièce vers un fichier et un décalage.

+0

Merci pour le conseil. Je viens de lire à propos de la portabilité en utilisant le drapeau binaire. Mais, j'utilise "file_get_contents" de toute façon ... –

Questions connexes