Bencode-кодирование

Bencode (произносится как "Bee-Encode") — это формат для хранения и передачи любых структурированных данных в BitTorrent. Поддерживаются следующие типы данных:

Bencode-кодирование используется в .torrent файлах. Это файлы метаданных и по сути являются просто закодированными словарями. Данные, которые посылает клиенту трекер, также преобразовываются в bencode.

Несмотря на то что при bencode-кодировании информация храниться в текстовом формате, а не в виде бинарнарных данных (и соответственно занимает больший объем) — bencode-кодирование все же имеет ряд преимуществ. Так например, числа кодируются в десятичной системе счисления и их представление не зависит от порядка следования байт, что важно для кроссплатформенных приложений. Также, приложения могут просто игнорировать неизвестные им ключи словарей, что делает добавление новых параметров более гибким и позволяет избежать проблем с совместимостью разных версий.

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

Все символы разделителей и цифр, используемые при bencode-кодировании и указанные в правилах ниже — это ASCII-символы. Правила кодирования для каждого типа данных:

Целое число
i<число в десятичной системе счисления>e. Целые числа не имеют ограничений по размеру. Отрицательные значения кодируются добавлением в начале числа знака минус, но при этом запрещено использование  в начале числа нулей (конечно же кроме самого числа ноль). Например число 42 кодируется как i42e, -42 как i-42e и ноль как i0e. Неверные значения: i-0e или i042e.
Строка байтов
<длина>:<содержимое>. Строка байтов — это последовательность символов (не обязательно печатных). Длина кодируется положительным десятичным числом или нулем. Содержимое — это байты, которые формируют строку. Строка «spam» кодируется как 4:spam. Спецификация не определяет способ кодирования символов не входящих в набор ASCII. Чтобы как-то это исправить, некоторые BitTorrent-приложения явно сообщают кодировку (чаще всего это UTF-8) различными не стандартными способами.
Список значений
l<содержимое>e. Содержимое состоит из bencode-кодированных элементов списка, отсортированных и объединенных вместе. Список, состоящий из строки «spam» и числа 42: ['spam', 42] — кодируется как l4:spami42ee. Обратите внимание на отсутствие разделителей между элементами.
Словарь
d<содержимое>e. Элементы словаря кодируются и объединяются вместе. Каждое значение следует непосредственно за ключом, связанным с ним. Все ключи должны быть строками байт, и быть отсортированы в лексикографическом порядке. Словарь, связывающий значения 42 и «spam» с ключами «foo» и «bar» соответственно, кодируется следующим образом: d3:bar4:spam3:fooi42ee (Для большей наглядности можно вставить несколько пробелов: d 3:bar 4:spam 3:foo i42e e).

В списках и словарях нет никаких ограничений на тип хранимых значений. Они могут (и обычно так и есть) содержат другие списки и словари. Это позволяет кодировать сложные структуры данных.

Дополнительная информация

Дата последней правки: 20.11.2010
Комментарии…
Перейти наверх