Введение
Формат сериализации данных Bencode (произносится как Bee encode) — это кодирование, используемое системой файлообмена BitTorrent для хранения и передачи слабоструктурированных данных. Он поддерживает четыре различных типа значений: байтовые строки, целые числа, списки и словари (ассоциативные массивы). Bencode наиболее часто используется в торрент-файлах и, следовательно, является частью спецификации BitTorrent. Эти файлы метаданных представляют собой просто закодированные словари. Bencode прост и (поскольку числа кодируются как текст в десятичной системе счисления) не зависит от порядка байтов, что важно для кроссплатформенного приложения, такого как BitTorrent. Он также достаточно гибок, поскольку приложения могут игнорировать неожиданные ключи словаря, что позволяет добавлять новые без нарушения совместимости.
Bencode (pronounced like Bee encode) is the encoding used by the peer to peer file sharing system BitTorrent for storing and transmitting loosely structured data. It supports four different types of values:
byte strings,
integers,
lists, and
dictionaries (associative arrays). Bencoding is most commonly used in torrent files, and as such is part of the BitTorrent specification. These metadata files are simply bencoded dictionaries. Bencoding is simple and (because numbers are encoded as text in decimal notation) is unaffected by endianness, which is important for a cross platform application like BitTorrent. It is also fairly flexible, as long as applications ignore unexpected dictionary keys, so that new ones can be added without creating incompatibilities.
Алгоритм кодирования
Bencode использует символы ASCII в качестве разделителей и цифр. Целое число кодируется как i<целое число, закодированное в десятичной системе счисления ASCII>e. Ведущие нули не допускаются (хотя число ноль все еще представляется как "0"). Отрицательные значения кодируются добавлением знака минус перед числом. Таким образом, число 42 будет закодировано как , 0 как , а -42 как . Отрицательный ноль не допускается. Байтовая строка (последовательность байтов, не обязательно символов) кодируется как <длина>:<содержимое>. Длина кодируется в десятичной системе, как целые числа, но должна быть неотрицательной (ноль разрешен); содержимое – это просто байты, составляющие строку. Строка "spam" будет закодирована как . Спецификация не рассматривает кодирование символов вне набора ASCII; для смягчения этой проблемы некоторые BitTorrent-приложения явно передают кодировку (чаще всего UTF-8) различными нестандартными способами. Это идентично работе netstrings, за исключением того, что netstrings дополнительно добавляют суффикс-запятую после последовательности байтов. Список значений кодируется как l<содержимое>e. Содержимое состоит из закодированных элементов списка, расположенных в порядке их следования и объединенных вместе. Список, состоящий из строки "spam" и числа 42, будет закодирован следующим образом: Обратите внимание на отсутствие разделителей между элементами, и первый символ – буква "l", а не цифра "1". Словарь кодируется как d<содержимое>e. Элементы словаря кодируются последовательно: сначала ключ, затем его значение. Все ключи должны быть байтовыми строками и должны располагаться в лексикографическом порядке. Словарь, который связывает значения 42 и "spam" с ключами "foo" и "bar" соответственно (то есть ), будет закодирован следующим образом: Нет ограничений на типы значений, которые могут храниться в списках и словарях; они могут (и обычно содержат) другие списки и словари. Это позволяет кодировать произвольно сложные структуры данных.