Formato de serialización de datos
Bencode (pronunciado como Bee-encode ) es la codificación utilizada por el sistema de intercambio de archivos peer-to-peer BitTorrent para almacenar y transmitir datos poco estructurados. [1]
Admite cuatro tipos diferentes de valores:
La codificación Bencoding se utiliza con mayor frecuencia en archivos torrent y, como tal, forma parte de la especificación BitTorrent. Estos archivos de metadatos son simplemente diccionarios codificados Bencoding.
La codificación binaria es sencilla y (debido a que los números se codifican como texto en notación decimal) no se ve afectada por el orden de bits , lo cual es importante para una aplicación multiplataforma como BitTorrent. También es bastante flexible, siempre que las aplicaciones ignoren las claves de diccionario inesperadas, de modo que se puedan agregar nuevas sin crear incompatibilidades.
Algoritmo de codificación
Bencode utiliza caracteres ASCII como delimitadores y dígitos.
- Un número entero se codifica como i <entero codificado en ASCII de base diez > e . No se permiten ceros a la izquierda (aunque el número cero se sigue representando como "0"). Los valores negativos se codifican anteponiendo al número un guión-menos . El número 42 se codificaría así como
i42e
, el 0 como i0e
; y el -42 como i-42e
. No se permiten ceros negativos. - Una cadena de bytes (una secuencia de bytes , no necesariamente caracteres) se codifica como <length> : <contents> . La longitud se codifica en base 10, como los números enteros, pero debe ser no negativa (se permite cero); el contenido son solo los bytes que forman la cadena. La cadena "spam" se codificaría como
4:spam
. La especificación no trata la codificación de caracteres fuera del conjunto ASCII; para mitigar esto, algunas aplicaciones BitTorrent comunican explícitamente la codificación (más comúnmente UTF-8 ) de varias formas no estándar. Esto es idéntico a cómo funcionan las netstrings , excepto que las netstrings agregan adicionalmente un sufijo de coma después de la secuencia de bytes. - Una lista de valores se codifica como l <contents> e . El contenido consiste en los elementos codificados de la lista, ordenados y concatenados. Una lista que consta de la cadena "spam" y el número 42 se codificaría como:
l4:spami42ee
. Nótese la ausencia de separadores entre elementos y que el primer carácter es la letra "l", no el dígito "1". - Un diccionario se codifica como d <contents> e . Los elementos del diccionario se codifican con cada clave seguida inmediatamente por su valor. Todas las claves deben ser cadenas de bytes y deben aparecer en orden lexicográfico . Un diccionario que asocia los valores 42 y "spam" con las claves "foo" y "bar", respectivamente (en otras palabras,
{"bar": "spam", "foo": 42}
), se codificaría de la siguiente manera: d3:bar4:spam3:fooi42ee
.
No existen restricciones sobre qué tipo de valores se pueden almacenar en listas y diccionarios; estos pueden (y normalmente lo hacen) contener otras listas y diccionarios. Esto permite codificar estructuras de datos de cualquier complejidad.
Características
Bencode es un tipo de codificación binaria muy especializado con algunas propiedades únicas:
- Para cada valor posible (complejo), solo existe una única codificación válida, es decir, existe una biyección entre los valores y sus codificaciones. Esto tiene la ventaja de que las aplicaciones pueden comparar valores codificados comparando sus formas codificadas, lo que elimina la necesidad de decodificar los valores.
- Bencoding cumple propósitos similares a los de los lenguajes de datos como JSON y YAML , lo que permite almacenar datos complejos pero poco estructurados de una manera independiente de la plataforma . Esto permite un almacenamiento de memoria lineal para datos complejos.
Desventajas
- Muchos grupos de códigos BE se pueden decodificar manualmente. Dado que los valores de BenCode suelen contener datos binarios , la decodificación puede resultar bastante compleja. BenCode no se considera un formato de codificación legible para humanos .
- La especificación se ocupa de codificar caracteres en el conjunto ASCII, dejando la solución a los usuarios. Esto genera varias soluciones y una menor conformidad.
Sin embargo, esta singularidad puede causar algunos problemas:
- Hay muy pocos editores de bencode [2]
- Debido a que los archivos bencode contienen datos binarios, y debido a algunas de las complejidades involucradas en la forma en que normalmente se almacenan las cadenas binarias, a menudo no es seguro editar archivos bencode en editores de texto.
Véase también
Referencias
- ^ La especificación del protocolo BitTorrent Archivado el 26 de julio de 2019 en Wayback Machine . BitTorrent.org. Consultado el 8 de octubre de 2018.
- ^ "BEncode Editor". Foros de la comunidad μTorrent. 8 de octubre de 2007. Archivado desde el original el 24 de octubre de 2014 . Consultado el 24 de octubre de 2014 .
Enlaces externos
- Especificación de Bencoding
- File_Bittorrent2 - Otra implementación de PHP Bencode/decodificación
- La implementación original de BitTorrent en Python como paquete independiente
- Editor de archivos Torrent Editor de interfaz gráfica de usuario multiplataforma para archivos BEncode
- bencode-tools: una biblioteca C para manipular datos bencodeados y un validador tipo esquema XML para mensajes bencode en Python
- Bento - Biblioteca Bencode en Elixir.
- Beecoder: el analizador de flujo de archivos que descodifica/decodifica el formato de datos "B-encode" en Java utilizando la API de flujo java.io.*.
- Análisis de Bencode en Java
- Biblioteca Bencode en Scala
- Análisis de Bencode en C
- Existen numerosas implementaciones de Perl en CPAN