util tobase64string example convertir convert base64encoder java base64

tobase64string - base64url en java



java util base64 example (9)

Con el uso de Base64 de Apache Commons, que puede configurarse para una URL segura, creé la siguiente función:

import org.apache.commons.codec.binary.Base64; public static String base64UrlDecode(String input) { String result = null; Base64 decoder = new Base64(true); byte[] decodedBytes = decoder.decode(input); result = new String(decodedBytes); return result; }

El constructor Base64(true) hace que la decodificación sea segura.

http://en.wikipedia.org/wiki/Base64#URL_applications

habla de base64Url - Decode

existe una Base64 modificada para la variante de URL, donde no se usará el relleno ''='', y los caracteres ''+'' y ''/'' de Base64 estándar se reemplazan respectivamente por ''-'' y ''_''

He creado la siguiente función:

public static String base64UrlDecode(String input) { String result = null; BASE64Decoder decoder = new BASE64Decoder(); try { result = decoder.decodeBuffer(input.replace(''-'',''+'').replace(''/'',''_'')).toString(); } catch (IOException e) { System.out.println(e.getMessage()); } return result; }

devuelve un conjunto muy pequeño de caracteres que ni siquiera se parecen a los resultados esperados. ¿algunas ideas?


Desde el principio, parece que su replace() está al revés; ese método reemplaza las apariciones del primer carácter con el segundo, no al revés.


En Java, pruebe el método Base64.encodeBase64URLSafeString() de la biblioteca Commons Codec para la codificación.


En el SDK de Android, hay un indicador dedicado en la clase Base64 : Base64.URL_SAFE , utilícelo para decodificar a una cadena:

import android.util.Base64; byte[] byteData = Base64.decode(body, Base64.URL_SAFE); str = new String(byteData, "UTF-8");


Java8 +

import java.util.Base64; return Base64.getUrlEncoder().encodeToString(bytes);



La respuesta de @ufk funciona, pero en realidad no es necesario establecer el indicador urlSafe cuando solo está decodificando.

urlSafe solo se aplica para codificar operaciones. La decodificación maneja a la perfección ambos modos.

Además, hay algunos ayudantes estáticos para hacerlo más corto y más explícito:

import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.binary.StringUtils; public static String base64UrlDecode(String input) { StringUtils.newStringUtf8(Base64.decodeBase64(input)); }

Docs



public static byte[] encodeUrlSafe(byte[] data) { byte[] encode = Base64.encode(data); for (int i = 0; i < encode.length; i++) { if (encode[i] == ''+'') { encode[i] = ''-''; } else if (encode[i] == ''/'') { encode[i] = ''_''; } } return encode; } public static byte[] decodeUrlSafe(byte[] data) { byte[] encode = Arrays.copyOf(data, data.length); for (int i = 0; i < encode.length; i++) { if (encode[i] == ''-'') { encode[i] = ''+''; } else if (encode[i] == ''_'') { encode[i] = ''/''; } } return Base64.decode(encode); }