En una nota relacionada, aquí hay un convertidor de base para la conversión de base arbitraria que creé para usted. ¡Disfrutar!
https://convert.zamicol.com/
¿Qué son los caracteres de relleno?
Los caracteres de relleno ayudan a satisfacer los requisitos de longitud y no tienen significado.
Ejemplo decimal de relleno:
dado el requisito arbitrario de que todas las cadenas tengan 8 caracteres de longitud, el número 640 puede cumplir con este requisito utilizando ceros anteriores como caracteres de relleno, ya que no tienen significado, "00000640".
Codificación binaria
El paradigma del byte: el byte es la unidad de medida estándar de facto y cualquier esquema de codificación debe relacionarse con los bytes.
Base256 encaja exactamente en este paradigma. Un byte es igual a un carácter en base256.
Base16 , hexadecimal o hexadecimal, utiliza 4 bits para cada carácter. Un byte puede representar dos caracteres base16.
Base64 no encaja uniformemente en el paradigma de bytes (ni base32), a diferencia de base256 y base16. Todos los caracteres base64 se pueden representar en 6 bits, 2 bits menos que un byte completo.
Podemos representar la codificación base64 frente al paradigma de bytes como una fracción: 6 bits por carácter sobre 8 bits por byte . Reducida esta fracción es de 3 bytes sobre 4 caracteres.
Esta proporción, 3 bytes por cada 4 caracteres base64, es la regla que queremos seguir al codificar base64. La codificación Base64 solo puede prometer una medición uniforme con paquetes de 3 bytes, a diferencia de base16 y base256, donde cada byte puede ser independiente.
Entonces, ¿ por qué se recomienda el relleno a pesar de que la codificación podría funcionar bien sin los caracteres de relleno?
Si se desconoce la longitud de una secuencia o si podría ser útil saber exactamente cuándo termina una secuencia de datos, utilice el relleno. Los caracteres de relleno comunican explícitamente que esos espacios adicionales deben estar vacíos y descarta cualquier ambigüedad. Incluso si se desconoce la longitud con el relleno, sabrá dónde termina su flujo de datos.
Como contraejemplo, algunos estándares como JOSE no permiten caracteres de relleno. En este caso, si falta algo, una firma criptográfica no funcionará o faltarán otros caracteres que no sean base64 (como el "."). Aunque no se hacen suposiciones sobre la longitud, el relleno no es necesario porque si hay algo mal, simplemente no funcionará.
Y esto es exactamente lo que dice el RFC base64 ,
En algunas circunstancias, no se requiere ni se utiliza el uso de relleno ("=") en datos codificados en base. En el caso general, cuando no se pueden hacer suposiciones sobre el tamaño de los datos transportados, se requiere el relleno para producir datos decodificados correctos.
[...]
El paso de relleno en base 64 [...] si se implementa incorrectamente, conduce a alteraciones no significativas de los datos codificados. Por ejemplo, si la entrada es solo un octeto para una codificación base 64, entonces se usan los seis bits del primer símbolo, pero solo se usan los primeros dos bits del siguiente símbolo. Estos bits de relleno DEBEN ponerse a cero mediante codificadores conformes, que se describen en las descripciones de relleno a continuación. Si esta propiedad no se cumple, no existe una representación canónica de datos codificados en base y se pueden decodificar múltiples cadenas codificadas en base a los mismos datos binarios. Si esta propiedad (y otras discutidas en este documento) se mantiene, se garantiza una codificación canónica.
El relleno nos permite decodificar la codificación base64 con la promesa de no perder bits. Sin relleno, ya no existe el reconocimiento explícito de medir en paquetes de tres bytes. Sin relleno, es posible que no pueda garantizar la reproducción exacta de la codificación original sin información adicional, generalmente de algún otro lugar de su pila, como TCP, sumas de comprobación u otros métodos.
Ejemplos
Aquí está el formulario de ejemplo RFC 4648 ( http://tools.ietf.org/html/rfc4648#section-8 )
Cada carácter dentro de la función "BASE64" usa un byte (base256). Luego traducimos eso a base64.
BASE64("") = "" (No bytes used. 0%3=0.)
BASE64("f") = "Zg==" (One byte used. 1%3=1.)
BASE64("fo") = "Zm8=" (Two bytes. 2%3=2.)
BASE64("foo") = "Zm9v" (Three bytes. 3%3=0.)
BASE64("foob") = "Zm9vYg==" (Four bytes. 4%3=1.)
BASE64("fooba") = "Zm9vYmE=" (Five bytes. 5%3=2.)
BASE64("foobar") = "Zm9vYmFy" (Six bytes. 6%3=0.)
Aquí hay un codificador con el que puede jugar: http://www.motobit.com/util/base64-decoder-encoder.asp