Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Base64 Decoder der Checksummen und Fehler ignoriert
unconnected
myCSharp.de - Member

Avatar #avatar-3200.jpg


Dabei seit:
Beiträge: 862
Herkunft: Oerlinghausen/NRW

Themenstarter:

Base64 Decoder der Checksummen und Fehler ignoriert

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16152

beantworten | zitieren | melden

Zitat
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.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
unconnected
myCSharp.de - Member

Avatar #avatar-3200.jpg


Dabei seit:
Beiträge: 862
Herkunft: Oerlinghausen/NRW

Themenstarter:

beantworten | zitieren | melden

Hallo,

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

Danke herbivore
private Nachricht | Beiträge des Benutzers