Laden...

Base64 Decoder der Checksummen und Fehler ignoriert

Erstellt von unconnected vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.379 Views
unconnected Themenstarter:in
849 Beiträge seit 2006
vor 9 Jahren
Base64 Decoder der Checksummen und Fehler ignoriert

Hallo,

ich habe einen Viewer für ZPL (Zebra Drucker Dateien) geschrieben. Diese übertragen Bilddateien im Base64 Format. Nun verhält es sich so, das hin und wieder Etiketten Dateien korrupt sind. Dem Drucker ist das recht egal, der druckt bis zum Fehlerhaften teil und macht dann mit Kauderwelsch weiter. Der .net base64 Decoder (Convert.FromBase64String) Schmeisst an dieser Stelle eine Exception und ich bekomme keinerlei Bild Informationen raus.

Kennt einer von euch einen Decoder der da ein wenig Fehler toleranter ist? Oder muss ich den tatsächlich wieder selber schreiben?

Grüße

16.832 Beiträge seit 2008
vor 9 Jahren

Schmeisst an dieser Stelle eine Exception

Und welche? 🤔

Wenns ne IllegalCharacterException ist, wie meist, dann kannste dagegen erst mal nichts tun, weil es eben Chars gibt, die einfach nicht erlaubt sind.
Du kannst sie aber vor der Umwandlung auf diese Zeichen prüfen und gegen irgendwas (zB statt % eben ein = ) ersetzen; dann stimmt wenigstens noch ein Teil der Info.

"Fehlertoleranz" hat auch eine Grenze; aber diese musst Du ja selbst definieren, wann diese Grenze erreicht ist.

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo unconnected,

die folgende Beschreibung fällt leichter, wenn aus dem Base-64String als Vorverarbeitungsschritt zunächst alle Leerzeichen, Tabs, Wagenrücklauf und Zeilenvorschubzeichen entfernt werden. Ich denke, man kann oder sollte sogar alle Steuerzeichen entfernen, also alle Zeichen mit Zeichencode ≤ 0x20. Im folgenden gehe ich davon aus, dass diese Vorverarbeitung bereits erfolgt ist.

Ich sehe drei Gründe, aus denen eine Umwandlung scheitern kann:
*Im String ist mindestens ein anderes Zeichen als [A-Za-z0-9+/=] enthalten. *Die Länge des Strings ist nicht durch vier teilbar. *Es sind mehr als zwei Gleichheitszeichen enthalten oder die enthalten Gleichheitszeichen stehen nicht alle am Ende des Strings.

Um einen String, bei dem mindestens einer drei Gründe vorliegt, in einen möglichst großen Teil-String umzuwandeln, der sich konvertieren lässt, würde ich den String vor dem ersten Zeichen, das nicht in [A-Za-z0-9+/] enthalten ist(*), abschneiden. Anschließend würde ich die letzten 0-3 Zeichen des Ergebnisses abschneiden, so dass die resultierende String-Länge durch vier teilbar ist.

Die Prüfungen und Reparatur-Schritte so wie beschrieben auszuprogrammieren, wäre zwar nicht schwierig, aber lästig. Zum Glück kann man den gleichen (bzw. sogar noch einen etwas besseren) Effekt mit zwei Regex.Anweisungen erzielen.

Zur Vorverarbeitung:

base64 = Regex.Replace (base64, "[\x00-\x20]+", "");

Zur Ermittlung des längsten konvertierbaren Teilstrings:

base64 = Regex.Match (base64, "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?").Value;

herbivore

(*) Man beachte, dass hier kein Gleichheitszeichen enthalten ist.

unconnected Themenstarter:in
849 Beiträge seit 2006
vor 9 Jahren

Hallo,

stimmt die Möglichkeit einfach den InputString vorher zu korregieren, hatte ich ausser acht gelassen.

Danke herbivore