Articulo de referencia

Base32

Base32 es una codificación binaria a texto basada en el sistema numérico de base 32. Utiliza un alfabeto de 32 dígitos , cada uno de los cuales representa una combinación difere...

Base32 es una codificación binaria a texto basada en el sistema numérico de base 32. Utiliza un alfabeto de 32 dígitos , cada uno de los cuales representa una combinación diferente de 5 bits (2⁵ ) . Dado que Base32 no está muy extendido, la cuestión de la notación, es decir, qué caracteres usar para representar los 32 dígitos, no está tan definida como en el caso de sistemas numéricos 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 formato legible para humanos es usar 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 ). Base32 se usa a menudo para representar cadenas de bytes.

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 de los precedentes, 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 estas recomendaciones no es universal. Se debe tener cuidado al usar sistemas que se denominan base32, ya que estos sistemas podrían ser base32 según RFC 4648 §6, o según §7 (posiblemente sin tener en cuenta la obsolescencia de ese RFC del nombre más simple para este último), o podrían ser otra variante de codificación, véase más adelante. 

Codificación en base 32 según el §6

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

En algunos casos, el relleno no es necesario ni se utiliza (puede inferirse a partir de la longitud de la cadena módulo 8). El RFC 4648 establece que el relleno debe utilizarse a menos que la especificación del estándar (que hace referencia al RFC) indique explícitamente lo contrario. Excluir el relleno resulta útil al utilizar datos codificados en Base32 en tokens de URL o nombres de archivo, donde el carácter de relleno podría generar problemas.

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

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

"Hexadecimal extendido" base 32 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 el RFC 2938 bajo el nombre de "Base-32". El RFC 4648, si bien reconoce el uso existente de esta versión en NSEC3 , se refiere a ella como base32hex y desaconseja referirse a ella simplemente como "base32". 

Dado que esta notación utiliza 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 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 la RFC 4648. [ 3 ]parseInt()int()

A diferencia de muchos otros sistemas de notación de base 32, los dígitos de base32hex más allá del 9 son contiguos. Sin embargo, su conjunto de dígitos incluye caracteres que pueden generar conflictos visuales. Con muchas fuentes es posible distinguir visualmente entre caracteres de aspecto similar como (0, O) y (1, I), pero en otras fuentes esto puede ser difícil y, por lo tanto, pueden no ser adecuadas para representar secuencias de caracteres base32. Esto es especialmente cierto en un sistema de notación que solo expresa números, cuando el contexto que suele proporcionar el inglés no está presente. [ b ] La elección de la fuente no está controlada ni por la notación ni por la codificación, pero base32hex no intenta compensar las deficiencias de las fuentes afectadas. [ c ]

Esquemas de codificación alternativos

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

z-base-32

z-base-32 [ 7 ] es una codificación Base32 diseñada por Zooko Wilcox-O'Hearn para facilitar su uso y hacerla más compacta. Incluye 1 , 8 y 9 , pero excluye l , v , 0 y 2. Además, permuta el alfabeto de manera que los caracteres más fáciles sean los que aparecen con mayor frecuencia. Codifica de forma compacta cadenas de bits cuya longitud en bits no es múltiplo de 8 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 verificación módulo 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.

Existen bibliotecas para codificar datos binarios en Base32 de Crockford, disponibles en varios lenguajes de programación.

Electrológica

Los programadores que trabajaban en la Electrologica X1 utilizaban una forma anterior de notación en base 32 para representar las direcciones de las máquinas. 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

En el algoritmo Geohash , se utiliza una representación base32 modificada para representar los valores de latitud y longitud en un entero positivo (entrelazado por bits). [ 9 ] Esta representación 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:

La codificación de Turing

Aproximadamente en 1950, [ 10 ] Alan Turing escribió los requisitos de software para el sistema informático Manchester Mark I. [ 11 ] Una transcripción del manual de Turing para el Mark I está disponible en archive.org. [ 12 ]

El sitio de archivo de la Universidad de Manchester que conmemora los 60 años de la informática [ 13 ] contiene una tabla con la codificación en base 32 que utilizó Turing. La tabla y la explicación que la acompaña también aparecen en el manual.

Otro relato de este período en la vida de Turing aparece en su página biográfica bajo el título " Primeras computadoras y la prueba de Turing" .

Juegos de vídeo

Antes de que la NVRAM se generalizara, varios videojuegos para plataformas de Nintendo utilizaban números en base 31 para las contraseñas . Estos sistemas omiten las vocales (excepto la Y) para evitar que el juego introduzca accidentalmente una contraseña inapropiada . Por lo tanto, los caracteres suelen ser 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. Algunos juegos que utilizan este sistema son Mario Is Missing!, Mario's Time Machine , Tetris Blast y El Señor de los Anillos (Super NES) .

alfabeto seguro para palabras

El alfabeto Base32, que permite la escritura segura de 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. Al tratar el alfabeto como sensible a mayúsculas y minúsculas, se obtiene un conjunto de 32 (8+12+12) dígitos.

Comparaciones con otros sistemas

Ventajas

Base32 tiene varias ventajas sobre Base64:

  1. El conjunto de caracteres resultante utiliza una sola mayúscula o minúscula, lo que a menudo puede ser beneficioso al usar 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 rutas de Unix .
  3. Se puede seleccionar el alfabeto para evitar pares de símbolos diferentes de aspecto similar, 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 uno, ocho y cero, ya que podrían confundirse con las letras 'I', 'B' y 'O'). 
  4. Un resultado sin relleno puede incluirse en una URL sin codificar ningún carácter.

Base32 tiene ventajas sobre hexadecimal / Base16 :

  1. La representación en 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 podrían tener ventajas cuando se utilizan para la transmisión de caracteres:

  1. El esquema Base32 de la sección 6 de la RFC 4648, que incluye el alfabeto completo, y otros 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), lo que ahorra ancho de banda en dominios con recursos limitados, como las redes de radio.

Desventajas

La representación Base32 ocupa aproximadamente un 20 % más de espacio que Base64 . Además, debido a que codifica cinco bytes de 8 bits (40 bits) en ocho caracteres Base32 de 5 bits en lugar de tres bytes de 8 bits (24 bits) en cuatro caracteres Base64 de 6 bits, el relleno hasta un límite de 8 caracteres supone una mayor carga para los mensajes cortos (lo que podría ser un motivo para omitir el relleno, una opción contemplada en la RFC 4648 ). 

Aunque Base32 ocupa aproximadamente un 20 % menos de espacio que el hexadecimal , su uso es mucho menor. El hexadecimal se puede convertir fácilmente a bytes, ya que dos dígitos hexadecimales constituyen un byte. Base32 no se convierte a bytes individuales. Sin embargo, dos dígitos Base32 corresponden a diez bits, que pueden codificar (32 × 32 =) 1024 valores, con aplicaciones evidentes 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 no se recuerdan al instante, es más fácil contar a través de 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 trigésimo tercero para relleno), así como un algoritmo para codificar secuencias arbitrarias de bytes de 8 bits en un alfabeto Base32. Dado 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 se ajusta exactamente a los 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 que sea un múltiplo de 5 bits. El sistema Base64, estrechamente relacionado, utiliza un conjunto de 64 símbolos (o 65 símbolos cuando se usa relleno).

Existen implementaciones de Base32 en C/C++, [ 14 ] [ 15 ] Perl, [ 16 ] Java, [ 17 ] JavaScript, [ 18 ] Python, [ 19 ] Go [ 20 ] y Ruby [ 21 ] . [ 22 ]

Véase también

  • .onion – Dominio de Internet de nivel superior de uso especial 
  • Ascii85 : codificación para una secuencia de valores de bytes utilizando 85 caracteres imprimibles. 
  • Base16 : Codificación de una secuencia de valores de bytes mediante representación hexadecimal.
  • Base64 : codificación para una secuencia de valores de bytes utilizando 64 caracteres imprimibles. 
  • Base36 : codificación para una secuencia de valores de bytes utilizando 36 caracteres imprimibles. 
  • Base58 : Representación de datos binarios como texto. Páginas que muestran descripciones breves de destinos de redireccionamiento. 
  • Geohash : sistema de geocodificación de dominio público inventado en 2008. 
  • Idioma Ngiti : utiliza un sistema numérico de base 32 [ 23 ]

Notas

  1. Para contextualizar, el estándar propuesto también documenta dos codificaciones base64, y en este caso también expresa preferencia por una, aunque por razones diferentes. Solo se documenta una codificación base16, adoptada universalmente desde hace mucho tiempo, incluso antes de la publicación de la RFC 4648 o su predecesora, la RFC 3548.
  2. La similitud solía ser una ventaja, no un inconveniente, ya que 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. Con la llegada de los ordenadores, se consideró deseable que las primeras impresoras pudieran producir el mismo tipo de letra que las máquinas de escribir de calidad; por lo tanto, las fuentes tipo máquina de escribir mantuvieron la apariencia de estas letras. En el momento de escribir esto (2025), ya no es necesario usar fuentes que no distingan claramente algunas letras, pero la tradición persiste. Además, no solo las fuentes estilo máquina de escribir presentan problemas similares; muchas fuentes influyentes también, como Helvetica .
  3. El diseño de muchas variantes de base32 se basa en la idea de que es arriesgado asumir que se utilizará una fuente distintiva. Por otro lado, la lógica de un sistema que no intenta compensar peculiaridades ajenas a su ámbito puede ser más sencilla.

Referencias

  1. "Estándares oficiales del protocolo de Internet » Editor de RFC" . 
  2. ^ Myers, J. (23 de mayo de 2000). Mecanismos SASL GSSAPI . IETF . ID borrador-ietf-cat-sasl-gssapi-01 . Consultado el 24 de junio de 2023 .
  3. 1 2 Josefsson, Simon (2006). "7. Codificación Base 32 con alfabeto hexadecimal extendido" . RFC 4648: Las codificaciones de datos Base16, Base32 y Base64 . IETF. doi : 10.17487/RFC4648 .
  4. Lanctot, Christian (1999-03-01). "¿Una mejor cita? (segunda carta bajo ese encabezado) - 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 del original el 26/10/2018 . Consultado el 09/08/2017 .
  7. O'Whielacronx, Zooko (2009). "Codificación base-32 orientada al ser humano" .
  8. Douglas Crockford. "Base 32" . Archivado del original el 23 de diciembre de 2002.
  9. "Consejos y trucos - geohash.org" . geohash.org . Archivado del original el 28 de abril de 2020. Consultado el 3 de abril de 2020 .
  10. "Alan M. Turing (1912 - 1954)" . Computer 50. Universidad de Manchester . Consultado el 17 de abril de 2025 .
  11. "Alan M. Turing (1912 - 1954)" . Digital 60. Universidad de Manchester . Consultado el 17 de abril de 2025 .
  12. Alan M. Turing, transcrito por Robert S. Thau (13 de febrero de 2000). "Manual de Alan Turing para la Ferranti Mk. I" (PDF) . Computer 50. Universidad de Manchester. Archivado del original (PDF) el 7 de junio de 2011. Consultado el 17 de abril de 2025 .
  13. "Programación en la Ferranti Mark 1" . Digital 60. Universidad de Manchester . Consultado el 17 de abril de 2025 .
  14. "CyoEncode" . SourceForge . 24 de junio de 2023.
  15. "Gnulib - Biblioteca de Portabilidad GNU - Proyecto GNU - Fundación del Software Libre" . www.gnu.org .
  16. "MIME-Base32 - Codificador y decodificador Base32" . MetaCPAN . Consultado el 29 de julio de 2018 .
  17. "Base32 (API de Apache Commons Codec 1.15)" . commons.apache.org .
  18. "base32" . npm . 27 de septiembre de 2022.
  19. "base64 — Codificaciones de datos Base16, Base32, Base64, Base85" . Documentación de Python .
  20. "Paquete Base32 - encoding/Base32 - PKG.go.dev" .
  21. "base32 | RubyGems.org | tu comunidad de alojamiento de gemas" . rubygems.org .
  22. "Convertidor de cadena a hexadecimal" . Embellecer código .
  23. Hammarström, Harald (2006), "Raridades en sistemas numéricos", Actas de la Conferencia Rara & Rarissima (PDF) , archivado del original (PDF) el 19 de agosto de 2007 , consultado el 23 de octubre de 2009.