83 votes

Supprimer le "=" à la fin lors de l'encodage en base64

Je remarque que chaque fois que j'encode une chaîne en base64, un "=" est ajouté à la fin. Puis-je supprimer ce caractère, puis le décoder de manière fiable plus tard en le rajoutant, ou est-ce dangereux ? En d'autres termes, le "=" est-il toujours ajouté, ou seulement dans certains cas ?

Je veux que ma chaîne encodée soit aussi courte que possible, c'est pourquoi je veux savoir si je peux toujours supprimer le caractère "=" et le rajouter avant de décoder.

38voto

magikMaker Points 434

En JavaScript, vous pouvez faire quelque chose comme ceci :

 // 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, '/');

Voir aussi ce violon : http://jsfiddle.net/7bjaT/66/

18voto

= est ajouté pour le remplissage. La longueur d'une chaîne en base64 doit être un multiple de 4, donc 1 ou 2 = sont ajoutés si nécessaire.

Lire : Non, vous ne devriez pas le supprimer.

7voto

Code.IT Points 1075

Sur Android, j'utilise ceci :

Global

 String CHARSET_NAME ="UTF-8";

Encoder

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

Décoder

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

équivaut à ceci sur Java :

Encoder

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

Décoder

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

Je n'ai jamais eu de problèmes avec le "=" et j'utilise également Bouncycastle

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X