javax.xml.bind est Base64 encodeur/décodeur mange deux derniers caractères de la chaîne
J'ai besoin de convertir des chaînes de caractères à l'aide de l'encodage Base64, et a été ravi de voir que je n'avais pas rouler mes propres converter--Java fournit un avec javax.xml.bind.DataConverter
. Cependant, il a quelques problèmes. Voici la sortie de mon temps avec un Jython REPL:
>>> import javax.xml.bind.DatatypeConverter as DC
>>> import java.lang.String as String
>>> def foo(text):
... return DC.printBase64Binary(DC.parseBase64Binary(String(text)))
...
>>> foo("hello")
'hell'
>>> foo("This, it's a punctuated sentence.")
'Thisitsapunctuatedsenten'
>>> foo("\"foo\" \"bar\"")
'foob'
>>> foo("\"foo\" \"bar\"12")
'foobar12'
>>> foo("\"foo\" \"bar\"1")
'foob'
Comme vous pouvez le voir, il ne gère pas les caractères non-alphanumériques à tous, et aussi souvent-mais pas toujours-tronque la chaîne de deux caractères.
Je suppose que c'est peut-être temps pour tout écrire ma propre classe, mais maintenant, je suis gêné que a) je ne suis pas à la lecture de la javadoc ou quelque chose b) La classe ne fonctionne pas comme prévu.
De sorte que toute aide est très appréciée, merci d'avance.
Je ne le pense pas... ça ne veut pas parler de la situation dans cette question.
J'ai déjà regardé ce post plusieurs fois 🙂 Le problème est que je ne peux pas utiliser des bibliothèques tierces. C'est là que j'ai eu l'idée d'essayer
javax.xml.bind
.OriginalL'auteur tsm | 2011-06-07
Vous devez vous connecter pour publier un commentaire.
hello
n'est pas une Chaîne base64, si le traitement échoue. Vous devez convertir la chaîne en un tableau d'octets (essayezString(text).getBytes('UTF-8')
) et ensuite appelerDC.printBase64Binary()
sur le tableau d'octets pour obtenir les données en Base64.DC.parseBase64Binary()
va ensuite convertir ce des données encodées en Base64 de retour dans le tableau d'octets (que vous pouvez ensuite convertir en arrière dans une chaîne de caractères).parseBase64Binary()
accepter une Chaîne--je n'ai pas réussi à réaliser ce devait être une Chaîne codée. Faire votre chemin a passé tous mes cas de test--grand!OriginalL'auteur Aaron Digulla
Quelques conclusions après avoir passé du temps sur la résolution d'un problème similaire sur un GAE plate-forme (Base64 decoder mange dernier (deux), personnages lors du décodage en base64, chaîne de facebook)
Si la chaîne codée n'est pas un 4*n longueur, alors la méthode
DatatypeConverter.parseBase64Binary
peut tomber certains caractères de fin (le rendu de la charge utile JSON syntaxiquement incorrect).Ma solution a été d'ajouter le code suivant:
En ce qui concerne l'exemple de code dans la question, je vous suggère un changement où la chaîne de test obtient première codé puis décodé, c'est à dire:
OriginalL'auteur Draško Kokić
Vous n'êtes pas complet base64 (y compris finale de rembourrage), etc pour commencer. Si vous lui donnez un complète base64 chaîne, elle doit être fine.
Vous ne devriez essayer d'interpréter les données comme si c'est base64 si il est vraiment base64 pour commencer. De le faire avec l'arbitraire des séquences de caractères est une mauvaise idée.
Il est difficile de savoir ce que vous êtes vraiment en train de faire, si vous n'êtes pas en train de commencer avec des données base64. Vous parlez de "la conversion de certaines chaînes" sont - ils en base64 ou pas?
OriginalL'auteur Jon Skeet
Je pense que le javax.xml.bind.DatatypeConverter classe peut s'attendre à travailler avec des données XML ou XSD types, comme la JavaDoc de la méthode des états pour le paramètre:
Personnellement je ne me sentirais pas à l'aise avec une classe/bibliothèque orientée vers XML transformations pour quelque chose comme ça.
Prendre un coup d'oeil à la chambre des communes-bibliothèque de codecs, qui a un facile à utiliser
Base64
de la classe.DatatypeConverter
inappropriés...le temps d'écrire mon propre, je suppose. Tout ce que je veux vraiment, c'est l'équivalent en Python de("foo".encode("base64")).decode("base64")
.OriginalL'auteur matt b
Vous devez écrire un texte expliquant votre réponse, et pas seulement coller du code.
OriginalL'auteur Prasun
Je suis la réception de données dans Deflater zip technique. Donc, un peu de fonction pour être décompressé est:
Ensuite, vous pouvez convertir l'octet à une nouvelle Chaîne ou quoi que ce soit d'autre.
OriginalL'auteur ELD