web-dev-qa-db-fra.com

Le tableau d'octets d'entrée a un octet de fin incorrect à 40

J'ai une chaîne codée en base64. Cela ressemble à ceci:

eyJibGExIjoiYmxhMSIsImJsYTIiOiJibGEyIn0=

Tout outil en ligne peut le décoder dans la chaîne appropriée qui est {"bla1":"bla1","bla2":"bla2"}. Cependant, ma mise en œuvre Java échoue:

import Java.util.Base64;
System.out.println("payload = " + payload);
String json = new String(Base64.getDecoder().decode(payload));

J'obtiens l'erreur suivante:

payload = eyJibGExIjoiYmxhMSIsImJsYTIiOiJibGEyIn0=
Java.lang.IllegalArgumentException: Input byte array has incorrect ending byte at 40

Quel est le problème avec mon code?

15
toom

D'accord, je l'ai découvert. La chaîne d'origine est codée sur un appareil Android utilisant Android.util.Base64 Par Base64.encodeToString(json.getBytes("UTF-8"), Base64.DEFAULT);. Elle utilise le schéma de codage Android.util.Base64.DEFAULT.

Ensuite, côté serveur lors de l'utilisation de Java.util.Base64, Cela doit être décodé avec Base64.getMimeDecoder().decode(payload)pas avec Base64.getDecoder().decode(payload)

22
toom

J'essayais d'utiliser les chaînes des arguments. J'ai trouvé que si j'utilisais arg[0].trim() cela fonctionnait. par exemple

Base64.getDecoder().decode(arg[0].trim());

Je suppose qu'il y a une sorte d'espace blanc qui le gâche.

1
JustGage

Peut-être trop tard, mais j'ai aussi eu ce problème.

Par défaut, l'utilitaire Android Base64 ajoute un caractère de nouvelle ligne à la fin de la chaîne codée.
L'indicateur Base64.NO_WRAP indique à l'utilisateur de créer la chaîne codée sans le caractère de nouvelle ligne.

Votre application Android devrait coder src quelque chose comme ceci:

String encode = Base64.encodeToString(src.getBytes(), Base64.NO_WRAP);
0
Artem Komarov