11
votes

Y a-t-il une bibliothèque de base64 compatible avec Android et Java

J'ai une bibliothèque commune que j'utilise pour les projets Java et Android et nécessite un codeur / décodeur de base64. Le problème est que la bibliothèque Apache Commons ne fonctionne pas avec Android, du moins pas que j'ai pu implémenter avec succès - en raison de la mise en œuvre déjà de la mise en œuvre et une version antérieure et entraînant ainsi une erreur au moment de l'exécution chaque fois que je tente de coder ou de décoder: xxx

retourne l'erreur: xxx

Si quelqu'un connaît une bibliothèque de base64 compatible avec Java et Android, ou peut expliquer à Moi comment se contenter de la question des Commons Apache, je serais très reconnaissant. : ^)


6 commentaires

Vous êtes sûr que vous n'utilisez tout simplement pas la bibliothèque Apache Commons Codec? La méthode en question est là depuis des années.


Oui, je l'incluais. Il y a un conflit dans Android à l'aide de la version 5 ou supérieure. Ces méthodes n'existent pas avant la version 5 - si je comprends et Android utilise la version 4.


Et si vous ne me croyez pas, essayez-le vous-même et prouvez-moi mal. Utilisation d'Apache Commons V1.7 I Obtenir l'erreur suivante -> AndroidRuntime (1420): Java.Lang.noschmethoderror: org.apache.commons.codec.binaire.base64.decodebase64


Pour le bien de la bonté, comme indique WebNet, apprenez l'algorithme simple et écrivez le vôtre. Vous pouvez même l'écrire en JavaScript.


Alors, pourquoi ne pouvez-vous pas utiliser les méthodes que sont présentes dans 4?


Guava en aura un en libération 14.0, bien que ce ne soit pas encore sorti.


3 Réponses :


11
votes

Il y a juste "base64". C'est si trivial que vous pouvez google pour n'importe quel "Java Base64" et utiliser toute implémentation.

Modifier

Si vous ciblez Pre API8, saisissez simplement la source de la mise en œuvre de base64 à partir de API8 (c'est Android / UTIL / BASE64.JAVA ) et copiez-vous dans votre projet.


5 commentaires

Si je pouvais utiliser une implémentation, alors les communes Apache travailleraient, alors le Sun.Misc.Base64Decoder, mais cela ne le fait pas non plus. Je veux seulement une bibliothèque d'une source de confiance.


Il suffit donc d'utiliser des sources Android et de la mettre dans votre projet. J'ai ajouté un lien vers ma réponse modifiée


D'accord avec webnetmobile.com, copiez la source de base64.java à partir de Android et mettez-la dans votre projet.


Si vous avez une bibliothèque qui dépend d'une classe BASE64, vous devez probablement fourrer la bibliothèque et mettre à jour les références. Il est probable que c'est qu'il essaie d'importer foo.bar.base64 lorsque vous avez com.yourdapplication.util.base64 .


Ok j'ai eu la source de travailler à Android et je vérifie actuellement dans mes applications J2EE maintenant. Marquera comme réponse si cela fonctionne. Muchas gracias si cela fonctionne !!!



2
votes

Roulez le vôtre.

Voici le décodage: p> xxx pré>

et voici: p>

private final static String BASE64_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
        PAD1 = "=", PAD2 = "==";

static public String ToBase64(final byte [] a)
{
    int l = a.length;
    StringBuilder sb = new StringBuilder((l+3)*4/3);
    int i;
    int mod = l % 3;
    int ll = l - mod;
    int triad;
    for(i=0;i<ll;i+=3)
    {
        triad = (a[i]<<16) | (a[i+1]<<8) | a[i+2];
        sb.append(BASE64_ALPHABET.charAt((triad >> 18) & 0x3f));
        sb.append(BASE64_ALPHABET.charAt((triad >> 12) & 0x3f));
        sb.append(BASE64_ALPHABET.charAt((triad >> 6) & 0x3f));
        sb.append(BASE64_ALPHABET.charAt(triad & 0x3f));
    }
    if(mod == 1)
    {
        sb.append(BASE64_ALPHABET.charAt((a[i] >> 2) & 0x3f));
        sb.append(BASE64_ALPHABET.charAt((a[i] << 4) & 0x3f));
        sb.append(PAD2);
    }
    if(mod == 2)
    {
        triad = (a[i]<<8) | a[i+1];
        sb.append(BASE64_ALPHABET.charAt((triad >> 10) & 0x3ff));
        sb.append(BASE64_ALPHABET.charAt((triad >> 4) & 0x3f));
        sb.append(BASE64_ALPHABET.charAt((triad << 2) & 0x3f));
        sb.append(PAD1);        
    }
    return sb.toString();   
}


2 commentaires

J'ai essayé ceci et ça vaut sur le décodage. L'erreur est javax.crypto.badpaddingException


Ce code ne jette pas BadpaddingException n'importe où, seulement IllegalArgumentException . Doit être autre chose.



0
votes

Dans mon application, j'utilise Jackson et il fournit un codeur / décodeur de base64, vous pouvez l'utiliser si votre application utilise également Jackson.

import com.fasterxml.jackson.core.Base64Variants;

public class Foo {
    String encodeBase64(byte[] string) {
        return Base64Variants.getDefaultVariant().encode(string.getBytes());
    }
}


0 commentaires