Base64 String renvoyant une erreur de caractère non valide
Je reçois un Base64 caractère non valide erreur, même si je ne devrais pas.
Le programme prend un fichier XML et l'exporte dans un document. Si l'utilisateur le souhaite, il va compresser le fichier. La compression fonctionne très bien et renvoie une Chaîne Base64 qui est encodé en UTF-8 et écrite dans un fichier.
Quand il est temps de recharger le document dans le programme, je dois vérifier si il est compressé ou pas, le code est tout simplement:
byte[] gzBuffer = System.Convert.FromBase64String(text);
return "1F-8B-08" == BitConverter.ToString(new List<Byte>(gzBuffer).GetRange(4, 3).ToArray());
Il vérifie le début de la chaîne pour voir si il a ce type d'archive du code.
Maintenant, la chose est, tous mes tests travail. Je prends une chaîne de caractères, compresser, décompresser, et de la comparer à l'original. Le problème est quand je reçois la chaîne renvoyée par un jeu d'enregistrements ADO. La chaîne est exactement ce qui est écrit dans le fichier (avec l'ajout d'un "\0" à la fin, mais je ne pense pas que même n'importe quoi, même coupées ça en jette toujours). J'ai même copier et coller l'ensemble de la chaîne de caractères dans une méthode de test et de compresser/décompresser. Fonctionne très bien.
Les tests vont passer, mais le code échouer en utilisant la même chaîne? La seule différence est qu'au lieu de simplement déclarer un régulier de la chaîne et de la passer dans je suis un rendu à partir d'un jeu d'enregistrements.
Toutes les idées sur ce que je fais mal?
source d'informationauteur Brandon | 2009-04-02
Vous devez vous connecter pour publier un commentaire.
Vous dire
En fait, il fait quelque chose (il provoque votre code de jeter un
FormatException
:"caractère Invalide dans le Base-64 string") parce que leConvertir.FromBase64String
ne considère pas le "\0" pour être valide Base64 caractère.Solution: se débarrasser du zéro de la résiliation. (Peut-être l'appeler
.Trim("\0")
)Notes:
La MSDN docs pour
Convertir.FromBase64String
dire qu'il va jeter unFormatException
quandet que
Si null char est autorisé ou non dépend vraiment de base64 codec en question.
Compte tenu de l'imprécision de Base64 standard (il n'y a pas d'autorité spécification exacte), de nombreuses implémentations serait tout simplement l'ignorer comme un espace blanc. Et puis les autres peuvent le signaler comme étant un problème. Et buggiest ceux ne remarquent pas et heureusement essayer de les décoder... :-/
Mais il semble c# de mise en œuvre ne l'aime pas (ce qui est une approche valable) donc si suppression il aide, qui doit être fait.
Un petit commentaire: UTF-8 n'est pas une exigence, ISO-8859-x aka latine-x, et 7-bit Ascii marcherait aussi bien. Cela parce que Base64 a été spécifiquement conçu pour utiliser uniquement les 7 bits de sous-ensemble qui fonctionne avec tous les 7 bits ascii compatible encodages.
Si la suppression de \0 de fin de chaîne est impossible, vous pouvez ajouter votre propre personnage pour chaque chaîne de l'encodage, et de l'enlever sur les décoder.
Un piège à voir avec la conversion en Base64 à partir d'une chaîne, c'est que certaines fonctions de conversion d'utiliser le précédant "data:image/jpg;base64", et d'autres n'acceptent que les données réelles.
//changement de
chaîne stringToDecrypt = HttpUtility.UrlDecode(HttpContext.Actuel.Demande.QueryString.ToString())