stringtranslate.com

Base32

Base32 es un método de codificación basado en el sistema de numeración de base -32 . Utiliza un alfabeto de 32 dígitos , cada uno de los cuales representa una combinación diferente de 5 bits (2 5 ). Dado que base32 no está muy ampliamente adoptado, la cuestión de la notación (qué caracteres utilizar para representar los 32 dígitos) no está tan resuelta como en el caso de los sistemas de numeración más conocidos (como el hexadecimal ), aunque existen RFC y estándares no oficiales y de facto. Una forma de representar números Base32 en forma legible para humanos es utilizando los dígitos 0–9 seguidos de las veintidós letras mayúsculas A–V. Sin embargo, se utilizan muchas otras variaciones en diferentes contextos. Históricamente, el código Baudot podría considerarse un código base32 modificado ( con estado ).

Este artículo se centra en el uso de Base32 para representar cadenas de bytes en lugar de números enteros sin signo, de forma similar a como funciona Base64 .

Codificaciones RFC 4648

El estándar de Internet propuesto en octubre de 2006 [1] RFC  4648 documenta las codificaciones base16 , base32 y base64. Incluye dos esquemas para base32, pero recomienda uno sobre el otro. Además, recomienda que, independientemente del precedente, solo el alfabeto que define en su sección 6 se denomine base32, y que el otro alfabeto similar en su sección 7 se denomine base32hex. [a] El acuerdo con esas recomendaciones no es universal. Se debe tener cuidado al usar sistemas que se denominan base32, ya que esos sistemas podrían ser base32 según el RFC 4648 §6, o según el §7 (posiblemente sin tener en cuenta la desaprobación de ese RFC del nombre más simple para este último), o podrían ser otra variante de codificación, consulte más adelante.

Codificación de base 32 según §6

El alfabeto base32 más utilizado [ cita requerida ] se define en el RFC 4648 §6 y el anterior RFC  3548 (2003). El esquema fue diseñado originalmente en 2000 por John Myers para SASL / GSSAPI . [2] Utiliza un alfabeto de A – Z , seguido de 2 – 7 . Los dígitos , 1 y 8 se omiten debido a su similitud con las letras O , I y B (por lo tanto, "2" tiene un valor decimal de 26 ).

En algunas circunstancias, no se requiere ni se utiliza el relleno (el relleno se puede inferir de la longitud de la cadena módulo 8). La RFC 4648 establece que se debe utilizar el relleno a menos que la especificación del estándar (que hace referencia a la RFC) indique explícitamente lo contrario. Excluir el relleno es útil cuando se utilizan datos codificados en Base32 en tokens de URL o nombres de archivo donde el carácter de relleno podría plantear un problema.

Este es un ejemplo de una representación Base32 que utiliza el conjunto de 32 caracteres descrito anteriormente ( IPFS CIDv1 en codificación Base32 en mayúsculas):BAFYBEICZSSCDSBS7FFQZ55ASQDF3SMV6KLCW3GOFSZVWLYARCI47BGF354

Codificación de base 32 con alfabeto hexadecimal extendido según §7

Base 32 "hexadecimal extendida" o base32hex , [3] otro esquema para la base 32 según RFC 4648 §7, extiende el hexadecimal de una manera más natural: su mitad inferior es idéntica al hexadecimal, y más allá de eso, base32hex simplemente continúa el alfabeto hasta la letra V.

Este esquema fue propuesto por primera vez por Christian Lanctot, un programador que trabajaba en Sage Software , en una carta a la revista Dr. Dobb's en marzo de 1999 [4] como parte de una solución sugerida para el error Y2K . Lanctot se refirió a él como "Double Hex". El mismo alfabeto fue descrito en 2000 en RFC  2938 bajo el nombre "Base-32". RFC 4648, si bien reconoce el uso existente de esta versión en NSEC3 , se refiere a él como base32hex y desaconseja referirse a él solo como "base32".

Dado que esta notación utiliza los dígitos del 0 al 9 seguidos de letras consecutivas del alfabeto, coincide con los dígitos utilizados por la función de JavaScript [5] y el constructor de Python [6] cuando se especifica una base mayor que 10 (como 16 o 32). También conserva la propiedad del hexadecimal de preservar el orden de clasificación bit a bit de los datos representados, a diferencia de la base32 o base64 del §6 de RFC 4648. [3]parseInt() int()

A diferencia de muchos otros sistemas de notación de base 32, los dígitos de base32hex posteriores al 9 son contiguos. Sin embargo, su conjunto de dígitos incluye caracteres que pueden entrar en conflicto visualmente. Con la fuente correcta es posible distinguir visualmente entre 0, O y 1, I, pero otras fuentes pueden no ser adecuadas, ya que esas letras podrían ser difíciles de distinguir para los humanos, especialmente cuando el contexto que el inglés suele proporcionar no está presente en un sistema de notación que solo expresa números. [b] La elección de la fuente no está controlada por la notación o la codificación, pero base32hex no intenta compensar las deficiencias de las fuentes afectadas. [c]

Esquemas de codificación alternativos

Cambiando el alfabeto Base32, todos los estándares alternativos tienen combinaciones similares de símbolos alfanuméricos.

base z-32

z-base-32 [7] es una codificación Base32 diseñada por Zooko Wilcox-O'Hearn para que sea más fácil de usar para humanos y más compacta. Incluye 1 , 8 y 9 pero excluye l , v , y 2. También permuta el alfabeto de modo que los caracteres más fáciles sean los que aparecen con más frecuencia. [ aclaración necesaria ] Codifica de forma compacta cadenas de bits cuya longitud en bits no es un múltiplo de 8 [ aclaración necesaria ] y omite los caracteres de relleno finales. z-base-32 se utilizó en el proyecto de código abierto Mnet, y actualmente se utiliza en el protocolo ZRTP de Phil Zimmermann y en el proyecto de código abierto Tahoe-LAFS .

Base32 de Crockford

Otro diseño alternativo para Base32 es creado por Douglas Crockford , quien propone usar caracteres adicionales para una suma de comprobación mod-37. [8] Excluye las letras I, L y O para evitar confusiones con dígitos. También excluye la letra U para reducir la probabilidad de obscenidad accidental.

Las bibliotecas para codificar datos binarios en Base32 de Crockford están disponibles en una variedad de idiomas.

Electrológica

Los programadores que trabajaban en la Electrologica X1 utilizaban una forma anterior de notación de base 32 para representar direcciones de máquina. Los "dígitos" se representaban como números decimales del 0 al 31. Por ejemplo, 12-16 representaría la dirección de máquina 400 (= 12 × 32 + 16).

Geohash

Véase el algoritmo Geohash , utilizado para representar valores de latitud y longitud en un entero positivo (entrelazado por bits). [9] La representación base32 de Geohash utiliza todos los dígitos decimales (0-9) y casi todo el alfabeto en minúsculas, excepto las letras "a", "i", "l", "o", como se muestra en el siguiente mapa de caracteres:

Juegos de vídeo

Antes de que la NVRAM se volviera universal, varios videojuegos para las plataformas de Nintendo usaban números de base 31 para las contraseñas . Estos sistemas omiten las vocales (excepto Y) para evitar que el juego proporcione accidentalmente una contraseña profana . Por lo tanto, los caracteres son generalmente alguna variación menor del siguiente conjunto: 0–9, B, C, D, F, G, H, J, K, L, M, N, P, Q, R, S, T, V, W, X, Y, Z y algunos signos de puntuación. Los juegos que se sabe que usan este sistema incluyen Mario Is Missing!, Mario 's Time Machine , Tetris Blast y El Señor de los Anillos (Super NES) .

Alfabeto de palabras seguras

El alfabeto Base32, que no admite palabras, es una extensión del alfabeto Base20 de Open Location Code . Este alfabeto utiliza 8 dígitos numéricos y 12 dígitos de letras que distinguen entre mayúsculas y minúsculas, elegidos para evitar la formación accidental de palabras. Si se trata el alfabeto como sensible a mayúsculas y minúsculas, se obtiene un conjunto de 32 dígitos (8+12+12).

Comparaciones con otros sistemas

Ventajas

Base32 tiene una serie de ventajas sobre Base64 :

  1. El conjunto de caracteres resultante es todo de una sola letra, lo que a menudo puede resultar beneficioso cuando se utiliza un sistema de archivos que no distingue entre mayúsculas y minúsculas , nombres DNS , lenguaje hablado o memoria humana.
  2. El resultado se puede utilizar como nombre de archivo porque no puede contener el símbolo '/', que es el separador de ruta de Unix .
  3. Se puede seleccionar el alfabeto para evitar pares de símbolos diferentes que parezcan similares, de modo que las cadenas se puedan transcribir con precisión a mano. (Por ejemplo, el conjunto de símbolos RFC  4648 §6 omite los dígitos correspondientes al uno, ocho y cero, ya que podrían confundirse con las letras "I", "B" y "O").
  4. Se puede incluir un resultado que excluya el relleno en una URL sin codificar ningún carácter.

Base32 tiene ventajas sobre el hexadecimal / Base16 :

  1. La representación Base32 ocupa un 20% menos de espacio. (1000 bits ocupan 200 caracteres, en comparación con los 250 de Base16).

En comparación con las codificaciones basadas en 8 bits, los sistemas de 5 bits también pueden tener ventajas cuando se utilizan para la transmisión de caracteres:

  1. Con el alfabeto completo, el esquema RFC 4648 §6 Base32 y similares permiten codificar dos caracteres más por cada entero de 32 bits (para un total de 6 en lugar de 4, con 2 bits de sobra), ahorrando ancho de banda en dominios restringidos como radiomeshes.

Desventajas

La representación en base32 ocupa aproximadamente un 20 % más de espacio que en base64 . Además, dado que codifica cinco bytes de 8 bits (40 bits) en ocho caracteres en base32 de 5 bits en lugar de tres bytes de 8 bits (24 bits) en cuatro caracteres en base64 de 6 bits, el relleno hasta un límite de 8 caracteres supone una carga mayor en los mensajes cortos (lo que puede ser una razón para omitir el relleno, que es una opción en RFC  4648).

Aunque Base32 ocupa aproximadamente un 20% menos de espacio que el hexadecimal , Base32 se utiliza mucho menos. El hexadecimal se puede asignar fácilmente a bytes porque dos dígitos hexadecimales son un byte. Base32 no se asigna a bytes individuales. Sin embargo, dos dígitos Base32 corresponden a diez bits, que pueden codificar (32 × 32 =) 1024 valores, con aplicaciones obvias para órdenes de magnitud de unidades de varios bytes en términos de potencias de 1024.

El sistema hexadecimal es más fácil de aprender y recordar, ya que solo implica memorizar los valores numéricos de seis símbolos adicionales (A–F), e incluso si estos no se recuerdan instantáneamente, es más fácil contar solo un puñado de valores.

Implementaciones de software

Los programas Base32 son adecuados para codificar datos de bytes arbitrarios utilizando un conjunto restringido de símbolos que pueden ser utilizados cómodamente por humanos y procesados ​​por computadoras.

Las implementaciones de Base32 utilizan un conjunto de símbolos compuesto por al menos 32 caracteres diferentes (a veces un 33.º para el relleno), así como un algoritmo para codificar secuencias arbitrarias de bytes de 8 bits en un alfabeto Base32. Debido a que se necesita más de un carácter Base32 de 5 bits para representar cada byte de entrada de 8 bits, si la entrada no es un múltiplo de 5 bytes (40 bits), entonces no cabe exactamente en caracteres Base32 de 5 bits. En ese caso, algunas especificaciones requieren que se agreguen caracteres de relleno, mientras que otras requieren bits cero adicionales para formar un múltiplo de 5 bits. El sistema Base64, estrechamente relacionado, en cambio, utiliza un conjunto de 64 símbolos (o 65 símbolos cuando se utiliza relleno).

Están disponibles implementaciones de Base32 en C/C++, [10] [11] Perl, [12] Java, [13] JavaScript, [14] Python, [15] Go [16] y Ruby [17] . [18]

Véase también

Notas

  1. ^ Para contextualizar, el estándar propuesto también documenta dos codificaciones base64 y también aquí expresa preferencia por una, aunque por diferentes razones. Solo se documenta una codificación base16, que fue adoptada universalmente desde hace mucho tiempo, incluso antes de la publicación de RFC 4648 o su predecesora RFC 3548.
  2. ^ La similitud solía ser una característica, no un error, porque permitía a las primeras máquinas de escribir omitir teclas adicionales para los números 0 y 1, reduciendo así la complejidad mecánica. Cuando se introdujeron las computadoras, se consideró deseable que las primeras impresoras de computadora pudieran producir el mismo tipo que las máquinas de escribir de calidad, por lo tanto, las fuentes similares a las de las máquinas de escribir mantuvieron estas letras con un aspecto similar. Muchos años después, ya no es necesario usar fuentes que no distingan claramente algunas letras, pero la tradición persiste. Tampoco son solo las fuentes de estilo de máquina de escribir las que tienen problemas similares: muchas fuentes influyentes los tienen, por ejemplo, Helvética .
  3. ^ El diseño de muchas variantes de base32 se basa en la idea de que es arriesgado suponer que se utilizará una fuente distinguible. Por otro lado, la lógica de un esquema que no intente compensar peculiaridades que estén fuera de su ámbito de competencia puede ser más sencilla.

Referencias

  1. ^ "Estándares oficiales del protocolo de Internet » Editor RFC".
  2. ^ Myers, J. (23 de mayo de 2000). Mecanismos SASL GSSAPI. ID borrador-ietf-cat-sasl-gssapi-01 . Consultado el 24 de junio de 2023 .
  3. ^ ab Josefsson, Simon (2006). "7. Codificación de base 32 con alfabeto hexadecimal extendido". RFC 4648: Codificaciones de datos base 16, base 32 y base 64 . IETF. doi : 10.17487/RFC4648 .
  4. ^ Lanctot, Christian (1 de marzo de 1999). "¿Una cita mejor? (segunda carta bajo ese título) - Cartas". Dr. Dobb's .
  5. ^ "parseInt() - JavaScript". Documentos web de MDN . Mozilla. 29 de diciembre de 2023.
  6. ^ "Funciones integradas". Documentación de Python . Python Software Foundation. Archivado desde el original el 26 de octubre de 2018 . Consultado el 9 de agosto de 2017 .
  7. ^ O'Whielacronx, Zooko (2009). "Codificación base-32 orientada a humanos".
  8. ^ Douglas Crockford. "Base 32". Archivado desde el original el 23 de diciembre de 2002.
  9. ^ "Consejos y trucos - geohash.org". geohash.org . Consultado el 3 de abril de 2020 .
  10. ^ "CyoEncode". SourceForge . 24 de junio de 2023.
  11. ^ "Gnulib - Biblioteca de Portabilidad GNU - Proyecto GNU - Free Software Foundation". www.gnu.org .
  12. ^ "MIME-Base32 - Codificador y decodificador Base32". MetaCPAN . Consultado el 29 de julio de 2018 .
  13. ^ "Base32 (API de Apache Commons Codec 1.15)". commons.apache.org .
  14. ^ "base32". npm . 27 de septiembre de 2022.
  15. ^ "base64 — Codificaciones de datos Base16, Base32, Base64, Base85". Documentación de Python .
  16. ^ "Paquete Base32 - codificación/Base32 - PKG.go.dev".
  17. ^ "base32 | RubyGems.org | el servidor de gemas de tu comunidad". rubygems.org .
  18. ^ "Convertidor de cadena a hexadecimal". Código de embellecimiento .