web-dev-qa-db-fra.com

Encodage en Base64: caractère illégal en base64 3c

J'essaie de décoder des données au format XML en octets (base64) et j'ai des problèmes. J'ai écrit un programme en Java qui prend une donnée String et la convertit en octets comme ceci:

String data = "......"; //string of data in xml format
byte[] dataBytes = Base64.getDecoder().decode(data);

Cela échoue et donne moi et exception comme ça:

Java.lang.IllegalArgumentException: Illegal base64 character 3c
    at Java.util.Base64$Decoder.decode0(Base64.Java:714)
    at Java.util.Base64$Decoder.decode(Base64.Java:526)
    at Java.util.Base64$Decoder.decode(Base64.Java:549)
    at XmlReader.main(XmlReader.Java:61)

Le format XML n'est-il pas compatible avec base64? Il semble que le problème puisse être causé par les chevrons '<>'

2
VMA92

Grâce à @ luk2302, j'ai pu résoudre le problème. Avant de décoder la chaîne, je dois d'abord l'encoder en Base64

    byte[] dataBytes = Base64.getEncoder().encode(data.getBytes());
    dataBytes = Base64.getDecoder().decode(dataBytes);
0
VMA92

Il suffit d'utiliser cette méthode

getMimeDecoder () 

String data = "......";
byte[] dataBytes =  Base64.getMimeDecoder().decode(data);
8
Moddasir Khan

Vous devez d’abord extraire les octets de la chaîne (dans certains codages de caractères).

Pour ces octets, utilisez l'encodeur pour créer la représentation en Base64 de ces octets.

Cette chaîne Base64 peut ensuite être décodée en octets et avec le même codage, vous convertissez ces octets en chaîne.

import Java.nio.charset.StandardCharsets;
import Java.util.Base64;

public class Base64Example {

  public static void main(String[] args) {
    final String xml = "<root-node><sub-node/></root-node>";
    final byte[] xmlBytes = xml.getBytes(StandardCharsets.UTF_8);
    final String xmlBase64 = Base64.getEncoder().encodeToString(xmlBytes);
    System.out.println(xml);
    System.out.println(xmlBase64);

    final byte[] xmlBytesDecoded = Base64.getDecoder().decode(xmlBase64);
    final String xmlDecoded = new String(xmlBytesDecoded, StandardCharsets.UTF_8);
    System.out.println(xmlDecoded);
  }

}

La sortie est:

<root-node><sub-node/></root-node>
PHJvb3Qtbm9kZT48c3ViLW5vZGUvPjwvcm9vdC1ub2RlPg==
<root-node><sub-node/></root-node>
0
vanje

J'ai eu cette même erreur et le problème était que la chaîne commençait par data:image/png;base64, ...

La solution était:

byte[] imgBytes = Base64.getMimeDecoder().decode(imgBase64.split(",")[1]);
0
André Pacheco