Бенкоде
Bencode (произносится как Bee-encode ) — это кодировка, используемая одноранговой системой обмена файлами BitTorrent для хранения и передачи слабо структурированных данных. [1]
Он поддерживает четыре различных типа значений:
Бенкодирование чаще всего используется в торрент-файлах и поэтому является частью спецификации BitTorrent. Эти файлы метаданных представляют собой просто закодированные словари.
Бенкодирование является простым и (поскольку числа кодируются как текст в десятичной системе счисления) не зависит от порядка байтов , что важно для кросс-платформенных приложений, таких как BitTorrent. Он также достаточно гибок, поскольку приложения игнорируют неожиданные ключи словаря, поэтому новые можно добавлять, не создавая несовместимости.
Алгоритм кодирования
[ редактировать ]Bencode использует символы ASCII в качестве разделителей и цифр.
- Целое число кодируется как i <целое число в десятичной кодировке ASCII > e . Ведущие нули не допускаются (хотя число ноль по-прежнему представляется как «0»). Отрицательные значения кодируются путем добавления к числу дефиса-минус . Таким образом, число 42 будет закодировано как
i42e
, 0 какi0e
; и -42 какi-42e
. Отрицательный ноль не допускается. - Строка байтов (последовательность байтов , не обязательно символов) кодируется как <длина> : <содержание >. Длина кодируется по базе 10, как и целые числа, но не должна быть отрицательной (допускается ноль); содержимое — это просто байты, составляющие строку. Строка «спам» будет закодирована как
4:spam
. Спецификация не касается кодирования символов вне набора ASCII; Чтобы смягчить это, некоторые приложения BitTorrent явно передают кодировку (чаще всего UTF-8 ) различными нестандартными способами. Это идентично тому, как работают сетевые строки , за исключением того, что сетевые строки дополнительно добавляют суффикс-запятую после последовательности байтов. - Список значений кодируется как l <contents> e . Содержимое состоит из закодированных элементов списка, объединенных по порядку. Список, состоящий из строки «спам» и числа 42, будет закодирован как:
l4:spami42ee
. Обратите внимание на отсутствие разделителей между элементами, а первым символом является буква «л», а не цифра «1». - Словарь кодируется как d <contents> e . Элементы словаря кодируются так, что за каждым ключом сразу следует его значение. Все ключи должны представлять собой байтовые строки и располагаться в лексикографическом порядке . Словарь, который связывает значения 42 и «спам» с ключами «foo» и «bar» соответственно (другими словами,
{"bar": "spam", "foo": 42}
), будет закодировано следующим образом:d3:bar4:spam3:fooi42ee
.
Нет ограничений на то, какие значения могут храниться в списках и словарях; они могут (и обычно содержат) содержать другие списки и словари. Это позволяет кодировать произвольно сложные структуры данных.
Функции
[ редактировать ]Bencode — это очень специализированный вид двоичного кодирования с некоторыми уникальными свойствами:
- Для каждого возможного (комплексного) значения существует только одно допустимое кодирование; т.е. существует биекция между значениями и их кодировками. Преимущество этого заключается в том, что приложения могут сравнивать закодированные значения путем сравнения их закодированных форм, что устраняет необходимость декодирования значений.
- Bencoding служит тем же целям, что и языки данных, такие как JSON и YAML , позволяя хранить сложные, но слабо структурированные данные независимым от платформы способом. Это позволяет хранить в линейной памяти сложные данные.
Недостатки
[ редактировать ]- Многие кодовые группы BE можно декодировать вручную. Поскольку закодированные значения часто содержат двоичные данные , декодирование может оказаться весьма сложным. Bencode не считается удобочитаемым форматом кодирования.
- Спецификация касается кодирования символов в наборе ASCII, оставляя решение пользователям. Это приводит к появлению нескольких решений и уменьшению соответствия.
Однако эта уникальность может вызвать некоторые проблемы:
- Редакторов bencode очень мало. [2]
- Поскольку файлы в кодировке содержат двоичные данные, а также из-за некоторых сложностей, связанных с обычным хранением двоичных строк, редактировать файлы в коде в текстовых редакторах часто небезопасно.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Спецификация протокола BitTorrent . Архивировано 26 июля 2019 г. на Wayback Machine . BitTorrent.org. Проверено 8 октября 2018 г.
- ^ «Редактор BEncode» . Форумы сообщества μTorrent. 8 октября 2007 г. Архивировано из оригинала 24 октября 2014 г. . Проверено 24 октября 2014 г.
Внешние ссылки
[ редактировать ]- Спецификация Бенкодирования
- File_Bittorrent2 — еще одна реализация PHP-бенкода/декодирования.
- Исходная реализация BitTorrent на Python как отдельный пакет.
- Torrent File Editor, кроссплатформенный редактор с графическим интерфейсом для файлов BEncode
- bencode-tools — библиотека C для управления закодированными данными и схема XML, такая как валидатор для сообщений bencode в Python.
- Bento — библиотека Bencode в Elixir.
- Beecoder — анализатор потока файлов, который декодирует формат данных «B-encode» на Java с использованием API потока java.io.*.
- Парсинг Bencode в Java
- Библиотека Bencode в Scala
- Разбор бенкода на C
- На CPAN существует множество реализаций Perl.