Base64 String zu werfen ungültiges Zeichen Fehler
Ich bekomme einen Base64-ungültiges Zeichen Fehler, obwohl ich nicht sollte.
Nimmt das Programm eine XML-Datei und exportiert Sie in ein Dokument. Wenn der user will, es wird komprimieren Sie die Datei als gut. Die Kompression arbeitet gut und gibt einen Base64-String der kodiert in UTF-8 und in eine Datei geschrieben.
Wenn seine Zeit, um neu zu laden Sie das Dokument in das Programm, das ich habe, um zu überprüfen, ob Ihre komprimierten oder nicht, der code ist einfach:
byte[] gzBuffer = System.Convert.FromBase64String(text);
return "1F-8B-08" == BitConverter.ToString(new List<Byte>(gzBuffer).GetRange(4, 3).ToArray());
Prüft es den Anfang des Strings zu sehen, ob es Gzip-Dateien code in es.
Nun die Sache ist die, alle meine tests arbeiten. Ich habe einen string, komprimieren, Dekomprimieren Sie Sie, und vergleichen Sie es mit dem original. Das problem ist, wenn ich die zurückgegebene Zeichenfolge aus einem ADO-Recordset. Der string ist genau das, was wurde geschrieben, um die Datei (mit dem Zusatz von ein "\0" am Ende, aber ich glaube nicht, dass sich noch etwas tut, auch abgeschnitten, es immer noch wirft). Ich auch kopiert und eingefügt, wird der gesamte string in einer test-Methode und komprimieren/Dekomprimieren. Funktioniert einwandfrei.
Den tests vergehen wird, aber der code wird nicht mit genau der gleichen Zeichenfolge? Der einzige Unterschied ist, statt nur erklärt, eine regelmäßige Zeichenfolge und Sie es ich bin gerade zurück aus einem recordset.
Irgendwelche Ideen auf, was mache ich falsch?
InformationsquelleAutor der Frage Brandon | 2009-04-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sagen Sie
In der Tat, es hat etwas zu tun (es bewirkt, dass Ihr code zu werfen
FormatException
:"Ungültige Zeichen in einer Base-64-Zeichenfolge"), weil derKonvertieren.FromBase64String
nicht der Auffassung, "\0" eine gültige Base64-Zeichen.Lösung: befreien Sie sich von der null-Terminierung. (Vielleicht nennen
.Trim("\0")
)Hinweise:
Den MSDN-Dokumentation für
Konvertieren.FromBase64String
sagen, wird es werfen eineFormatException
wennist und dass
InformationsquelleAutor der Antwort Daniel LeCheminant
Ob char null erlaubt ist oder nicht hängt wirklich davon ab, base64-codec in Frage.
Gegebene Vagheit der Base64-standard (es gibt keine autorisierende genaue Spezifikation), viele würden die Implementierungen ignorieren Sie es einfach als Leerzeichen. Und dann können andere Flagge als problem. Und buggiest diejenigen nicht bemerken würde, und würde gerne versuchen Decodierung... :-/
Aber es hört sich c# - Implementierung mag es nicht (das ist ein Gültiger Ansatz) so entfernen, wenn es hilft, dass getan werden sollte.
Eine kleine zusätzliche Bemerkung: UTF-8 ist keine Voraussetzung, ISO-8859-x aka Latin-x und 7-bit-Ascii-würde auch funktionieren. Dies, weil Base64 wurde speziell entwickelt, um die nur 7-bit-Teilmenge, die funktioniert mit allen 7-bit-ascii-kompatiblen Kodierungen.
InformationsquelleAutor der Antwort StaxMan
Wenn zum entfernen der \0 am Ende der Zeichenfolge ist unmöglich, Sie können eigene Zeichen für jede Zeichenfolge, die Sie Kodieren, und entfernen Sie Sie auf decode.
InformationsquelleAutor der Antwort abatishchev
Einer gotcha zu tun, mit der Umwandlung von Base64-string ist, dass einige Funktionen für die Konvertierung mithilfe des oben beschriebenen "data:image/jpg;base64," und die anderen nehmen nur die eigentlichen Daten.
InformationsquelleAutor der Antwort SteveCav
//änderung
string stringToDecrypt = HttpUtility.UrlDecode(HttpContext.Aktuelle.Anfrage.QueryString.ToString())
InformationsquelleAutor der Antwort Uday