traductor online convertir base64

base64 - convertir - decode online



Eliminar el final "=" cuando la codificación base64 (5)

En Android, estoy usando esto:

Global

String CHARSET_NAME ="UTF-8";

Codificar

String base64 = new String( Base64.encode(byteArray, Base64.URL_SAFE | Base64.NO_PADDING | Base64.NO_CLOSE | Base64.NO_WRAP), CHARSET_NAME); return base64.trim();

Descodificar

byte[] bytes = Base64.decode(base64String, Base64.URL_SAFE | Base64.NO_PADDING | Base64.NO_CLOSE | Base64.NO_WRAP);

es igual a esto en Java:

Codificar

private static String base64UrlEncode(byte[] input) { Base64 encoder = new Base64(true); byte[] encodedBytes = encoder.encode(input); return StringUtils.newStringUtf8(encodedBytes).trim(); }

Descodificar

private static byte[] base64UrlDecode(String input) { byte[] originalValue = StringUtils.getBytesUtf8(input); Base64 decoder = new Base64(true); return decoder.decode(originalValue); }

Nunca tuve problemas con el seguimiento de "=" y también estoy usando Bouncycastle

Me doy cuenta de que cada vez que base64 codifica una cadena, se agrega un "=" al final. ¿Puedo eliminar este carácter y luego decodificarlo de forma confiable más tarde al volver a agregarlo o es peligroso? En otras palabras, ¿ siempre se agrega "=", o solo en ciertos casos?

Quiero que mi cadena codificada sea lo más corta posible, por eso quiero saber si siempre puedo eliminar el carácter "=" y simplemente volver a agregarlo antes de decodificar.


En JavaScript puedes hacer algo como esto:

// if this is your Base64 encoded string var str = ''VGhpcyBpcyBhbiBhd2Vzb21lIHNjcmlwdA==''; // make URL friendly: str = str.replace(//+/g, ''-'').replace(////g, ''_'').replace(//=+$/, ''''); // reverse to original encoding if (str.length % 4 != 0) str += (''==='').slice(0, 4 - (str.length % 4)); str = str.replace(/-/g, ''+'').replace(/_/g, ''/'');

Ver también este violín: http://jsfiddle.net/7bjaT/66/


Escribí parte del decodificador de Apache commons-codec-1.4.jar Base64, y en esa lógica estamos bien sin los caracteres de relleno. Fin de archivo y Fin de flujo son tan buenos indicadores de que el mensaje de Base64 ha terminado como cualquier número de ''='' caracteres.

La variante URL-Safe que presentamos en commons-codec-1.4 omite los caracteres de relleno a propósito para mantener las cosas más pequeñas.

http://commons.apache.org/codec/apidocs/src-html/org/apache/commons/codec/binary/Base64.html#line.478

Supongo que una respuesta más segura es "depende de la implementación de tu decodificador", pero lógicamente no es difícil escribir un decodificador que no necesita relleno.


The = es relleno.

Wikipedia dice

Se asigna un carácter de relleno adicional que se puede usar para forzar la salida codificada en un múltiplo entero de 4 caracteres (o de manera equivalente cuando el texto binario no codificado no es un múltiplo de 3 bytes); estos caracteres de relleno deben descartarse al decodificar pero aún permiten el cálculo de la longitud efectiva del texto no codificado, cuando su longitud binaria de entrada no sea un múltiplo de 3 bytes (el último carácter no pad está codificado normalmente de modo que el último El bloque de 6 bits que representa se rellenará con cero en sus bits menos significativos, como máximo dos caracteres de parche pueden ocurrir al final de la secuencia codificada).

Si controla el otro extremo, puede quitarlo cuando está en transporte, luego volver a insertarlo (verificando la longitud de la cadena) antes de decodificar.
Tenga en cuenta que los datos no serán válidos Base64 en el transporte.


= se agrega para el relleno. La longitud de una cadena base64 debe ser múltiplo de 4, por lo que 1 o 2 = se agregan según sea necesario.

Leer: No, no deberías eliminarlo.