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)
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());
Base64.encode (octets) .toString () ne renvoie pas la chaîne attendue.
Tu devrais utiliser
new String(Base64.encode(bytes))
comme suggéré par iccthedral.
Si vous utilisez Android API 8+, il existe une classe d'assistance Base64
dans Android.util
.
String stringToStore = Base64.encodeToString(cipherText, Base64.DEFAULT);
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 ()); .______
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:
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)Base64.decode(stringToStore.getBytes())
)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.
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);
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]
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.