web-dev-qa-db-fra.com

Erreur lors de la tentative d'encodage/décodage de chaîne en base64

J'ai besoin de faire de l'encodage Base64 d'un tableau d'octets à remuer, par opposition à un autre tableau d'octets. Mais lorsque je le décode, je reçois une exception. Voici le code

J'essaie de coder un tableau d'octets dans une chaîne en utilisant le codage Base64. Lorsque je code, cela semble fonctionner, mais lorsque je décode, cela jette une exception. Qu'est-ce que je fais mal?

import org.springframework.security.crypto.codec.Base64;

byte[] bytes = new byte[]{1,2,3,4,5,6,7,8,9};
String stringToStore = Base64.encode(bytes).toString();
byte[] restoredBytes = Base64.decode(stringToStore.getBytes());

Voici l'exception que je reçois:

org.springframework.security.crypto.codec.InvalidBase64CharacterException: Bad Base64 input character decimal 91 in array position 0
at org.springframework.security.crypto.codec.Base64.decode(Base64.Java:625)
at org.springframework.security.crypto.codec.Base64.decode(Base64.Java:246)
16
user1651914

Pourriez-vous essayer ...

byte[] bytes = new byte[]{1,2,3,4,5,6,7,8,9}; 
String stringToStore = new String(Base64.encode(bytes));
byte[] restoredBytes = Base64.decode(stringToStore.getBytes()); 
16
nullpotent

Base64.encode (octets) .toString () ne renvoie pas la chaîne attendue.

Tu devrais utiliser 

new String(Base64.encode(bytes))

comme suggéré par iccthedral.

4
Samuel

Si vous utilisez Android API 8+, il existe une classe d'assistance Base64 dans Android.util

String stringToStore =  Base64.encodeToString(cipherText, Base64.DEFAULT);
2
scottyab

Initialement, si vous utilisez ceci pour les mots de passe, il n'est pas recommandé de convertir en chaînes. Pour utiliser comme chaîne suivre le segment de code suivant 


 byte [] bytes = new byte [] {1,2,3,4,5,6,7,8,9}; 
 String stringToStore = new String (Base64.encode (octets), "UTF-8"); 
 byte [] restoreBytes = Base64.decode (stringToStore.getBytes ()); .______
1
PRASA7

Cela fonctionne pour moi:

        byte[] bytes = new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9};
        String stringToStore = Base64.encode(bytes);
        //System.out.println(stringToStore);//AQIDBAUGBwgJ
        byte[] restoredBytes = Base64.decode(stringToStore);
        //System.out.println(Arrays.toString(restoredBytes));//[1, 2, 3, 4, 5, 6, 7, 8, 9]

Je l'ai édité un peu:

  • Ne pas appeler toString() sur une String. La méthode encode(bytes) retourne déjà une String (comme l'ont noté d'autres personnes qui appellent cela pourrait être la cause de l'erreur)
  • Pourquoi convertir en octets quand il n’est pas nécessaire d’utiliser plus de code (Base64.decode(stringToStore.getBytes()))
1
David Kroukamp
String stringToStore = Base64.encode(bytes).toString();

Cela ne change pas les octets en chaîne. C'est la représentation sous forme de chaîne de l'objet en Java (par exemple, "[B@9a4d5c6"). Vous devez faire ce que suggère iccthedral et fournir les octets à une classe String.

1
John Szakmeister

Pour décoder un tableau d'octets contenant du contenu base64, vous pouvez utiliser javax.xml.bind.DatatypeConverter . Ça marche plutôt bien. Je l'utilise pour décoder les valeurs MongoDB de type binaire.

String testString = "hi, I'm test string";
byte[] byteArrayBase64 = org.Apache.commons.codec.digest.DigestUtils.md5(testString);
String decoded = javax.xml.bind.DatatypeConverter.printBase64Binary(byteArrayBase64);
assert testString.equals(decoded);
0
albgorski

J'ai essayé Base64 de Apache codec , et le résultat est bon.

    import org.Apache.commons.codec.binary.Base64;
    byte[] bytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    Base64 base64 = new Base64();
    byte[] stringToStore = base64.encode(bytes);
    System.out.print(Arrays.toString(stringToStore));//[65, 81, 73, 68, 66, 65, 85, 71, 66, 119, 103, 74]
    byte[] restoredBytes = base64.decode(stringToStore);
    System.out.print(Arrays.toString(restoredBytes));//[1, 2, 3, 4, 5, 6, 7, 8, 9]
0
wodong

Base64.decode() apparaît pour renvoie un byte\[\] . L'appel de toString() vous donne une description Java par défaut du tableau, rien de tel que "56AB0FC3 ...". Vous auriez besoin de faire cette conversion vous-même.

De même, votre appel à getBytes() ne fait pas du tout ce que vous pensez.

0
Sean Owen