Введение

Формат сериализации данных Bencode (произносится как Bee encode) — это кодирование, используемое системой файлообмена BitTorrent для хранения и передачи слабоструктурированных данных. Он поддерживает четыре различных типа значений: байтовые строки, целые числа, списки и словари (ассоциативные массивы). Bencode наиболее часто используется в торрент-файлах и, следовательно, является частью спецификации BitTorrent. Эти файлы метаданных представляют собой просто закодированные словари. Bencode прост и (поскольку числа кодируются как текст в десятичной системе счисления) не зависит от порядка байтов, что важно для кроссплатформенного приложения, такого как BitTorrent. Он также достаточно гибок, поскольку приложения могут игнорировать неожиданные ключи словаря, что позволяет добавлять новые без нарушения совместимости.

Алгоритм кодирования

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" соответственно (то есть ), будет закодирован следующим образом: Нет ограничений на типы значений, которые могут храниться в списках и словарях; они могут (и обычно содержат) другие списки и словари. Это позволяет кодировать произвольно сложные структуры данных.