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

wikipedia.org, “Bencode”, public translation into Russian from English More about this translation.

Translate into another language.

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

Поддерживается четыре различных вида значений:

- строки байтов,

- целые числа,

- списки, и

- словари (ассоциативные массивы).

Чаще всего вencode-кодирование используется в .torrent файлах. Это файлы метаданных и по сути являются просто закодированными словарями.

Несмотря на то что bencode-кодирование менее эффективно, чем чистый двоичный код, оно простое. И поскольку числа кодируются в десятичной системе счисления, не зависит от порядка следования байт, что важно для кроссплатформенных приложений, каковым является BitTorrent. Также оно достаточно гибко, по крайней мере до тех пор пока приложения игнорируют не ожидаемые ими ключи словарей. Таким образом что-то новое может быть добавлено не создавая проблем с совместимостью.

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

Bencode-кодирование использует ASCII-символы как разделители и цифры.

- Целое число кодируется как i<число в десятичной системе счисления>e. Заметте, что отрицательные значения допускаются, и образуются добавлением в начале числа знака минус, но при этом запрещено использование в начале числа нулей (это не относится к самому числу ноль, которое по-прежнему обозначается как «0»). Число 42, например, кодируется как «i42e».

- Строка байтов (последовательность байтов, не обязательно печатные символы) кодируется как <длина>:<содержимое>. (Как netstrings, но без запятой в конце.) Длина кодируется десятичным числом, как целые числа, но должно быть положительным (ноль допускается); содержимое - это байты, которые формируют строку. Строка «spam» кодируется как «4:spam». Спецификация не определяет способ кодирования символов не входящих в набор ASCII; чтобы как-то это исправить, некоторые BitTorrent-приложения явно сообщают кодировку (чаще всего это UTF-8) различными не стандартными способами.

- Список значений кодируется как l<содержимое>e . Содержимое состоит из закодированных элементов списка, отсортированных и обьединенных вместе. Список, состоящий из строки «spam» и числа 42 кодируется как: «l4:spami42ee»; обратите внимание на отсутствие разделителей между элементами.

- Словарь кодируется как d<содержимое>e. Элементы словаря опять же кодируются с помощью bencode и обьединяются вместе, таким образом, что каждое значение следует непосредственно за ключом, связанным с ним. Все ключи должны быть строками байт, и быть отсортированы в лексикографическом порядке. Словарь, связывающий значения 42 и «spam» с ключами «foo» и «bar» соответственно, кодируется следующим образом: «d3:bar4:spam3:fooi42ee». (Возможно, было бы более читабельно если вставить несколько пробелов: «d 3:bar 4:spam 3:foo i42e e».)

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

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

- Для любого возможного (сколь угодно сложного) значения, есть только одно единственное правильное bencode-значение; то есть существует взаимно однозначное соответствие между значениями и их кодированным представлением. Это дает возможность приложениям сравнивать bencode-кодированные значения, не применяя раскодирования.

Большинство закодированных значений могут быть легко раскодированны «вручную», но по мере того как закодированные значения начинают часто содержат двоичные данные, и возможно, становятся весьма сложными, это в общем ухудшает понимание человеком закодированных значений.

Bencode-кодирование служит тем же целям, что и языки разметки XML и JSON, позволяет сложные, а также слабо структурированные данные хранить платформо-независимым способом.

Original (English): Bencode

Translation: © Ruzzz, Владимир Ступин, denton .

License: GNU Free Documentation License

translated.by crowd

Like this translation? Share it or bookmark!