Le décodage des données codées en base64 de document xml
De recevoir certains fichiers xml avec embedded base64 images, que j'ai besoin de décoder et de les enregistrer en tant que fichiers.
Pas été modifiée (autres que les zippé) exemple d'un tel fichier peut être téléchargé ci-dessous:
20091123-125320.zip (60 KO)
Cependant, j'ai des erreurs comme "Invalide la longueur de Base-64 char array" et de "caractère non Valide dans la Base-64 string". J'ai marqué la ligne de code où je reçois le message d'erreur dans le code.
Un fichier pourrait ressembler à ceci:
<?xml version="1.0" encoding="windows-1252"?>
<mediafiles>
<media media-type="image">
<media-reference mime-type="image/jpeg"/>
<media-object encoding="base64"><![CDATA[/9j/4AAQ[...snip...]P4Vm9zOR//Z=]]></media-object>
<media.caption>What up</media.caption>
</media>
</mediafiles>
Et le code pour traiter comme ceci:
var xd = new XmlDocument();
xd.Load(filename);
var nodes = xd.GetElementsByTagName("media");
foreach (XmlNode node in nodes)
{
var mediaObjectNode = node.SelectSingleNode("media-object");
//The line below is where the errors occur
byte[] imageBytes = Convert.FromBase64String(mediaObjectNode.InnerText);
//Do stuff with the bytearray to save the image
}
Les données xml à partir d'un journal d'entreprise système, donc je suis assez sûr que les fichiers sont ok et il doit y avoir quelque chose dans la façon dont j'ai procédé, qui est tout simplement faux. Peut-être un problème avec l'encodage?
J'ai essayé d'écrire le contenu de mediaObjectNode.InnerText, et c'est les données encodées en base64 - de sorte que la navigation dans le xml-doc n'est pas la question.
J'ai cherché sur google, binging, stackoverflowing et pleurer - et pas trouvé de solution... à l'Aide!
Edit:
Ajouté un exemple de fichier (et un bounty). Veuillez noter que le fichier à télécharger est un peu le schéma différent, puisque je l'ai simplifié dans l'exemple ci-dessus, la suppression de pertinence des trucs...
OriginalL'auteur Kjensen | 2009-11-20
Vous devez vous connecter pour publier un commentaire.
Pour un premier coup, je n'ai pas utiliser n'importe quel langage de programmation, juste Notepad++
J'ai ouvert le fichier xml à l'intérieur et de copier et de coller les premières base64 contenu dans un nouveau fichier (sans les crochets).
Ensuite, j'ai sélectionné tout (Ctrl-A) et utilisé l'option Extensions Mime Outils de décodage Base64. Cela a jeté une erreur sur le mal de la longueur du texte (doit être mod 4). Donc j'ai juste ajouté deux signes égal ('=') espace réservé à la fin pour obtenir la bonne longueur.
Un retry et décodée avec succès dans "quelque chose". Il suffit d'enregistrer le fichier en tant que .jpg et il s'ouvre comme un charme dans n'importe quelle image viewer.
Donc je dirais qu'il y a quelque chose de mal avec les données que vous allez obtenir. Ils n'ont tout simplement pas les bons chiffres de l'égalité des signes à la fin de remplir jusqu'à un certain nombre de signes qui peuvent être casser en paquets de 4.
Le "facile" serait d'ajouter le signe égal jusqu'le décodage ne renvoie pas d'erreur. La meilleure façon serait de compter le nombre de caractères (moins CR/LFs!) et d'ajouter celles nécessaires en une seule étape.
Enquêtes complémentaires
Après peu de codage et de la lecture de la fonction de conversion, le problème est une mauvaise fixation d'un signe égal au producteur. Notepad++ n'a pas de problème avec des tonnes de signes égal, mais la fonction de conversion à partir de MS ne fonctionne qu'avec zéro, un ou deux signes. Donc, si vous remplissez le déjà existant avec d'autres signes égal vous obtenez une erreur aussi! Pour obtenir cette fichue chose à travailler, vous devez couper tous les signes, de calculer combien sont nécessaires et ajoutez-les à nouveau.
Juste pour le bounty, voici mon code (pas parfait absolu, mais assez pour un bon point de départ): 😉
Je sais que c'est un vieux de la réponse, mais j'ai été aux prises avec ce problème. Il s'avère que c'est parce qu'il y avait trois "=" des signes. Qui le savait? Merci!
OriginalL'auteur Oliver
Le base64 chaîne n'est pas valide comme Oliver l'a déjà dit, la longueur de la chaîne doivent être des multiples de 4, après le retrait des caractères blancs. Si vous regardez à la fin de la chaîne base64 (voir ci-dessous), vous verrez que la ligne est plus courte que le reste.
Si vous supprimez cette ligne, votre programme de travail, mais le résultat de l'image aura une section manquante dans le coin en bas à droite. Vous avez besoin de pavé de cette ligne, donc l'ensemble de la longueur de la chaîne est corect. De mes calculs, si vous aviez 3 caractères, il doit travailler.
OriginalL'auteur Andrew
supprimer les 2 derniers caractères alors que l'image ne se
OriginalL'auteur swapnil malap
Essayez d'utiliser Linq to XML:
Mise à JOUR:
Après avoir téléchargé le fichier XML et l'analyse de la valeur de la
media-object
nœud, il est clair qu'il n'est pas valide en base64 chaîne:jette un
System.FormatException
dire que la longueur n'est pas valable en base 64 de la chaîne. Cas quand j'enlève le\n
de la chaîne, il ne fonctionne pas:jette aussi
System.FormatException
.OriginalL'auteur Darin Dimitrov
J'ai aussi eu un problème avec le décodage Base64 chaîne de document XML (plus particulièrement Office OpenXML document paquet).
Il s'est avéré que la chaîne avait supplémentaire de codage appliqué: le codage HTML, afin de faire d'abord HTML décodage, puis un décodage Base64 a fait le tour:
Juste au cas où quelqu'un d'autre tombe sur le même problème.
OriginalL'auteur Stipo
Bien, c'est très simple.
CDATA
est un nœud lui-même, de sortemediaObjectNode.InnerText
produit<![CDATA[/9j/4AAQ[...snip...]P4Vm9zOR//Z=]]>
, qui n'est évidemment pas valable données encodées en Base64.De faire fonctionner les choses, l'utilisation
mediaObjectNode.ChildNodes[0].Value
et de transmettre cette valeur àConvert.FromBase64String'
.OriginalL'auteur Anton Gogolev
Est l'encodage des caractères corrects? Les sons d'un problème est survenu qui provoque une défaillance de l'apparition de caractères dans le tableau. Essayez de copier le texte et le décodage manuellement pour voir si les données sont en effet valables.
(Pour mémoire, windows-1252 n'est pas exactement la même que la norme iso-8859-1, de sorte que peut être la cause d'un problème, à l'exclusion des autres sources de corruption.)
OriginalL'auteur futureelite7