El = final es relleno, no un carácter del texto original. Base64 representa tres bytes mediante cuatro caracteres. Un grupo final de un byte necesita ==; uno de dos bytes necesita = en el formato con relleno.
Cuenta bytes, no letras
Cada carácter de datos representa seis bits. Tres bytes completan 24 bits y cuatro caracteres. Los acentos y emojis pueden ocupar varios bytes UTF-8: 😀 ocupa cuatro bytes y produce 8J+YgA==. La tabla compara entradas de uno, dos y tres bytes.
Restaurar relleno omitido
Si el formato admite entrada sin relleno, elimina espacios y calcula la longitud módulo 4. Resto 2: añade ==; resto 3: añade =; resto 0: no añadas nada. Resto 1: la cadena es inválida o está truncada y añadir = no la repara. Comprueba siempre el formato esperado por la API.
Por qué Zg funciona y Zg= falla
Decodex restaura el relleno completamente omitido de Zg y obtiene f. Zg== también es válido. Zg= tiene relleno parcial y longitud incorrecta, por lo que se rechaza. A=AA y Zg=== también fallan. No añadas o elimines = repetidamente para ocultar un error de copia.
Probar este ejemplo
| Texto | UTF-8 bytes | Base64 | Relleno |
|---|---|---|---|
f | 1 | Zg== | == |
fo | 2 | Zm8= | = |
foo | 3 | Zm9v | — |
Preguntas frecuentes
¿Toda cadena Base64 termina en =?
No. Si el número de bytes es múltiplo de tres, no se necesita relleno. Otros protocolos omiten el relleno expresamente.
Referencias
Más guías de Base64
Base64 y Base64URL: diferencias, relleno y ejemplos
Compara Base64 y Base64URL, los caracteres + / y - _, el relleno y la decodificación de texto UTF-8 con ejemplos comprobados.
Base64 en JavaScript con Unicode: solucionar errores de btoa()
Codifica acentos, coreano y emojis con TextEncoder y decodifica con atob y TextDecoder. Código UTF-8 y ejemplos comprobados.
