Bencode (prononcé à l'anglaise « B encode ») est un encodage utilisé par le système de partage de fichier pair à pair BitTorrent pour stocker et transmettre des données structurées.
Il supporte quatre différentes types de valeurs :
Le bencoding est couramment utilisé pour les fichiers torrent. Ces fichiers de métadonnées sont de simples dictionnaires Bencode.
Avec une efficacité moindre par rapport à un encodage binaire pur, l'encodage via Bencode est simple et (car les nombres sont encodés comme du texte) n'est pas affecté par l' "endianness", ce qui est important pour un programme multiplate-forme comme BitTorrent. Il est aussi très flexible, tant que les applications ignorent les clés du dictionnaire, pour pouvoir continuer à interpréter la suite sans créer d'incompatibilités.
Bencode utilise des caractères ASCII comme délimiteur et chiffres.
- Un entier est encodé tel que i<entier en base 10 ASCII>e. Les zéros en têtes ne sont pas autorisés; le nombre 0 est toujours zéro par contre. Les nombres négatifs sont encodés en faisant précéder le nombre par un signe moins. Le nombre 42 serait alors encodé « i42e », 0 « i0e », et -42 « i-42e ». Un zéro négative (tel que « i-0e ») n'est pas autorisé.
- Une chaîne d'octets (une suite d'octets, pas nécessairement de caractères) est encodée <longueur>:<contenu>. La longueur est encodée en base 10, comme un entier, mais ne doit pas être négative (zéro autorisé); le contenu est l'ensemble des octets pour créer la chaîne. La chaîne « spam » serait alors encodée « 4:spam ». Les spécifications ne correspondent pas à l'encodage des caractères en dehors du jeu ASCII; pour réduire ce risque, certaines applications BitTorrent communiquent explicitement le format d'encodage (généralement UTF-8) de façon plus ou moins standardisée. C'est le même procédé qu'utilisé par netstrings (en), mis à part le fait que netstring ajoute une virgule après la chaîne.
- Une liste de valeurs est encodée l<contenu>e . Le contenu est constitué des éléments Bencodé de la liste dans l'ordre, concaténés. Une liste constituée de la chaîne "spam" et du nombre 42 serait encodée : "l4:spami42ee". Il est à noter l'absence de séparateur entre les éléments.
- Un dictionnaire est encodé d<contenu>e. Les éléments sont chacun encodés chaque clé suivie de sa valeur. Toutes les clés doivent être constituées d'une chaîne de caractères et apparaître dans l'ordre lexicographique. Un dictionnaire constitué des valeurs 42 et "spam" avec, respectivement, les clés "foo" et "bar", serait encodé: "d3:bar4:spam3:fooi42ee". (En ajoutant des espaces pour la lecture: "d 3:bar 4:spam 3:foo i42e e".)
Il n'y a pas de restrictions sur ce que peuvent stocker les listes et les dictionnaires ; ils contiennent généralement eux-mêmes des listes et des dictionnaires. Cela permet d'encoder simplement des structures de données complexes.
Bencode est un encodage très spécifique avec des propriétés uniques.
- Pour chaque valeur (complexe) possible, il n'y a qu'un seul encodage valide; i.e. il existe une bijection entre la valeur et son encodage. Cela présente l'avantage de pouvoir comparer les valeurs encodées en comparant leur forme, éliminant ainsi le fait de devoir les décoder pour cela.
- Plusieurs groupes de code Bencodé peuvent être décodés manuellement. Certaines valeurs Bencodé peuvent contenir des données binaires, les décoder serait alors complexe. L'encodage par Bencode n'est pas considéré comme lisible par l'Homme.
- L'encodage par Bencode propose les mêmes services que certains langages de stockage de données, comme le JSON ou le YAML, permettant de manipuler des structures de données complexes mais peu structurées sur différentes plates-formes.
Cependant, cette spécificité peut causer des problèmes:
- Il y a très peu d'éditeurs de BEncode[1]
- Les fichiers Bencodé contiennent des données binaires, et à cause de certaines des complexités impliquées dans la façon dont les chaînes binaires sont généralement stockés, il est souvent dangereux de modifier des fichiers BEncodés dans un éditeur de texte.
- Toute modification de l'indice de répertoire d'information dans un fichier Torrent modifie le hash du fichier. Sauf si vous savez ce que vous faites, vous ne devriez jamais modifier cette partie d'un fichier torrent.