¿Qué es Base91?
Base91 es una forma de escribir bytes arbitrarios usando solo caracteres ASCII imprimibles, la misma tarea que hace Base64, pero mete más bits en cada carácter. En lugar de trocear la entrada en grupos de 6 bits e imprimir un carácter por grupo, reúne bits hasta tener al menos 13, y luego imprime dos caracteres que juntos nombran el valor de esos 13 (o 14) bits.
Dos caracteres de un alfabeto de 91 pueden nombrar 91 × 91 = 8281 valores distintos, y 213 = 8192, así que dos caracteres siempre tienen sitio para 13 bits, con 89 valores de sobra. Ese es todo el truco: 13 bits por 2 caracteres son 6,5 bits por carácter, frente a los 6 de Base64, y permite una sobrecarga de unos 23% en lugar de 33%.
La versión de 30 segundos: test se convierte en fPNKd, y Hello, World! se convierte en >OwJh>}AQ;r@@Y?F. La decodificación es el proceso exacto inverso, y necesita el mismo alfabeto de 91 caracteres — un alfabeto distinto da una salida distinta a partir de los mismos bytes.
De dónde salen los 13 y los 14 bits
91 × 91 = 8281 valores pueden nombrarse con un par de caracteres, que son más que 213 = 8192 pero menos que 214 = 16384. Así que un par de caracteres siempre puede transportar 13 bits, y a veces 14. El codificador prueba primero con 13 bits: si el valor de 13 bits es mayor que 88, imprime ese valor como dos caracteres; si no, toma un 14.º bit e imprime el valor resultante de 14 bits.
El límite en 88 no es arbitrario. El mayor valor que pueden nombrar dos caracteres es 90 + 91 × 90 = 8280, y 8192 + 89 = 8281 ya lo supera. Así que ningún grupo de 14 bits puede tener una ventana baja de 13 bits de 89 o más, lo que significa que el decodificador puede distinguir los dos casos mirando solo el propio valor:
| Lo que ve el decodificador | Bits que consume | Por qué |
| valor & 8191 está entre 89 y 8191 | 13 bits | Los valores de 89 en adelante solo pueden venir de la rama de 13 bits, porque un grupo de 14 bits con una ventana baja de 13 bits tan alta tendría que ser al menos 8281 — algo que ningún par de caracteres puede nombrar. |
| valor & 8191 está entre 0 y 88 | 14 bits | El codificador solo recurre a 14 bits cuando la lectura de 13 bits fue 88 o menos, así que esta rama es la de respaldo y nada más. |
Lo que sobra al final — cualquier cosa de 1 a 13 bits — se imprime como un carácter, más un segundo carácter cuando el sobrante necesitaba realmente más de 7 bits. Por eso la longitud codificada crece en pasos de dos caracteres y a veces termina en un número impar.
El alfabeto, y los tres caracteres que deja fuera
El ASCII imprimible tiene 94 caracteres, desde ! (0x21) hasta ~ (0x7E). Base91 usa 91 de ellos, y los tres que deja fuera son el guion -, el apóstrofo ' y la barra invertida \. Las letras, los dígitos y casi toda la puntuación están en el alfabeto exactamente una vez, en el orden que muestra la tabla de arriba; los caracteres imprimibles del 92.º al 94.º simplemente no son direccionables.
Como el alfabeto tiene un orden fijo, el carácter de un valor es una búsqueda y no una fórmula. Dos implementaciones que ordenen el alfabeto de forma distinta serán ambas "Base91" y no podrán leer la salida de la otra, que es la causa más habitual de resultados confusos. Esta página imprime su alfabeto para que la salida siempre pueda rastrearse hasta él.
Base91 junto a las demás codificaciones imprimibles
| Codificación | Bits por carácter | Tamaño respecto a la entrada | Notas |
| Base16 (hex) | 4 | 200% | Dos caracteres por byte, trivialmente legible, sin alfabeto que consultar. |
| Base32 | 5 | 160% | Sin distinción de mayúsculas y segura para dictar, pero la más derrochadora del grupo. |
| Base58 | ~5,86 | ~137% | Elegida para direcciones, no por densidad: evita caracteres parecidos. |
| Base64 | 6 | 133% | El predeterminado en todas partes: 4 caracteres por cada 3 bytes, con los 6 bits sin usar del último carácter desperdiciados. |
| Ascii85 / Base85 | 6,4 | 125% | 5 caracteres por cada 4 bytes, sin tabla de búsqueda, pero divide entre 85 — vea el convertidor Ascii85. |
| Base91 | ~6,5 | ~123% | La más densa de estas: 13 bits por 2 caracteres, a costa de algún grupo de 14 bits aquí y allá. |
Los porcentajes son el coste asintótico de cada codificación, redondeado; los recuentos medidos de caracteres de una entrada real de 92 bytes están en la tabla de más arriba de esta página. Base91 está cerca de lo mejor que puede hacer cualquier codificación con ASCII imprimible: 7 bits por carácter significarían usar 128 caracteres distintos, que el rango imprimible no puede proporcionar.
Lo que Base91 no es
- No es un estándar. No hay RFC. La implementación de referencia es basE91 0.6.0 de Joachim Henke, publicada bajo la licencia BSD de 3 cláusulas; "Base91" también se usa para alfabetos que no son este.
- No es cifrado. Cada carácter es una simple reconfiguración de los bits de la entrada, y cualquiera con el alfabeto puede revertirla en una sola pasada.
- No es segura para URL. El alfabeto contiene
#, %, &, /, ? y ", y todos cambian de significado en una URL, así que la salida de Base91 tiene que codificarse en porcentaje antes de ir en una consulta. - No es segura para HTML. También contiene
<, >, & y ", así que una cadena Base91 colocada en el marcado tiene que escaparse con el convertidor de entidades HTML. - No tiene longitud fija. La longitud de la salida depende del patrón de bits, no solo del número de bytes, así que dos entradas del mismo tamaño pueden diferir en un carácter.
Trampas que de verdad muerden
- El alfabeto de esta página es el de referencia. Si otra herramienta produce una salida distinta para la misma entrada, compare su alfabeto antes de suponer que uno de los dos está roto. Los 91 caracteres deben aparecer en el mismo orden.
- Un solo carácter mal puesto puede cambiar toda la cola. Los límites de grupo los deciden los valores anteriores, así que una edición al principio de la cadena desplaza todo lo que viene después, y la cola se decodifica solo con los bits sobrantes del último grupo.
- Una longitud de salida impar es normal. No significa que la cadena se haya cortado; el último grupo imprime un carácter cuando su valor sobrante cabe en 7 bits o menos.
- Un ejemplo publicado puede llevar un salto de línea que usted no escribió. Un comando de shell que añade un fin de línea es la causa habitual de que un valor conocido de Base91 tenga un carácter más que el mismo texto aquí:
echo "Hello, World!" entrega al codificador 14 bytes e imprime >OwJh>}AQ;r@@Y?FF, mientras que los 13 bytes del texto solo imprimen >OwJh>}AQ;r@@Y?F. Ambos son correctos, para recuentos de bytes distintos, y el recuento bajo el cuadro de salida indica cuál tiene usted. - Decodificar datos binarios como texto no funcionará. Si los bytes decodificados no son UTF-8 válido, no hay texto sensato que mostrar, y para eso está el modo de salida hexadecimal.
Respuestas rápidas
«¿Por qué esta página muestra un valor que difiere en un carácter del de otra herramienta Base91?»
Casi siempre es un alfabeto distinto. La segunda causa más habitual es una herramienta que solo usa la rama de 13 bits y nunca el respaldo de 14 bits; esa variante es más pequeña en código, pero produce una salida distinta del algoritmo de referencia que se usa aquí.
También hay un caso exacto que se puede resolver contando bytes, y explica el ejemplo más citado de todos: un salto de línea final. La mayoría de los vectores publicados se generaron con un comando de shell, y el shell añade el fin de línea que cierra la línea. Los 13 bytes de Hello, World! imprimen 16 caracteres aquí, mientras que los 14 bytes de Hello, World! seguidos de un salto de línea imprimen la cadena de 17 caracteres >OwJh>}AQ;r@@Y?FF. Pegue cualquiera de los dos valores en Decodificar: esta página informa del número de bytes, así que las dos lecturas se pueden distinguir en lugar de discutir. El botón Ejemplo carga el que corresponde al lector que esté usando, y sigue el interruptor Codificar / Decodificar y el selector La entrada es / La salida es: el lector de texto recibe el valor de 16 caracteres, el lector hexadecimal recibe el de 17 caracteres con su byte final 0A a la vista, y el codificador recibe el texto que codificar en lugar de una cadena Base91.
«¿Es Base91 más pequeña que Base64?»
Sí, en unos un 8% del tamaño codificado: 13 bits por 2 caracteres frente a 6 bits por carácter. Con 92 bytes de texto, Base64 imprime 124 caracteres y Base91 imprime 114.
«¿Puedo decodificar esto con un decodificador Base64, o al revés?»
No. Los alfabetos se solapan en las letras y los dígitos, así que un decodificador Base64 aceptará una cadena Base91 como caracteres "válidos" y producirá basura en silencio. Ambos solo coinciden en la forma general del esquema.
«¿La salida termina en relleno como Base64?»
No. Base91 no tiene ningún carácter de relleno: los bits sobrantes al final se imprimen como el último grupo, así que no hay que añadir ni quitar nada.
«¿Cómo sé que el resultado de esta página es correcto?»
Pulse Autocomprobación de 0 a 64 bytes. Codifica y decodifica 130 patrones de bytes que cubren todas las longitudes en las que cambia la división de 13 y 14 bits, y compara los bytes que vuelven con los que entraron. Los vectores del botón Ejemplo se contrastan además con una segunda implementación escrita para las herramientas de prueba de este sitio.
Estándares y créditos
Esta página implementa el algoritmo de la implementación de referencia basE91 (versión 0.6.0) de Joachim Henke, distribuida bajo la licencia BSD de 3 cláusulas, con el alfabeto impreso arriba. La decodificación acepta e ignora los espacios en blanco, como lo hace la herramienta de referencia.
El texto de la página se escribió para este sitio; el algoritmo no se copió de ningún sitio. Los valores del botón Ejemplo son el único ejemplo que incluye el paquete de referencia (marcado como "ejemplo de referencia") más valores producidos por una segunda implementación independiente que se mantiene en las herramientas de prueba de este sitio (marcados como "contraste cruzado").