System.FormatException

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    System.FormatException

    Hallo allerseits,
    ich schreibe grade ein Programm von VB.NET auf C# um, um es später auf einem Windows10 Rechner, auf dem kein VB.NET Installiert ist und auch nicht wird, weiter bearbeiten und verwenden zu können.
    VB.NET verwendet .NET Framework 4.5 und C# .NET Framework 4.7.2
    Den Code habe ich 1:1 übersetzt. Die Daten werden aus der gleichen Datei in das Programm eingelesen.

    Das Programm generiert mit Passwort + Salt einen Hash-Wert, der zur Initialisierung des AES-Algorithmus dient.
    Ver und entschlüsselt wird unter anderem der Text in einer RichTextBox, in der auch Links zu Websites stehen und deren Multiline-Eigenschaft auf True gesetzt ist.

    Und genau hier bekomme ich bei einigen Einträgen, beim entschlüsseln in C# folgende Exception:
    Ungültige Länge für Base-64-Zeichenarray oder -Zeichenfolge.

    Zudem erscheint in der Ausgabe:
    "Side.exe" (CLR v4.0.30319: Side.exe): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_de_b77a5c561934e089\mscorlib.resources.dll" geladen. Das Modul wurde ohne Symbole erstellt.
    Ausnahme ausgelöst: "System.FormatException" in mscorlib.dll

    In VB läuft alles und in C# kommt die Exception.
    Würde bitte jemand meinem Verständnis hierfür auf die Sprünge Helfen?
    Das Chaos beginnt mit komprimierter Ordnung (Steppenpferd 2019)

    Steppenpferd schrieb:

    Und genau hier bekomme ich bei einigen Einträgen, beim entschlüsseln in C# folgende Exception:
    Ungültige Länge für Base-64-Zeichenarray oder -Zeichenfolge.
    Kannst Du mal eine Textprobe posten, also einen noch nicht konvertierten String, der nach Hin- und Her-Konvertierung diesen Fenler liefert?
    Welches Studio verwendest Du?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany danke erstmal das Du dich dem Thread annimmst.
    Habe es jetzt genauer getestet. Dazu habe ich die vb.exe des Programms in den Debug-Ordner des C#-Programms kopiert und per vb.exe Strings erzeugt die dann mit der C#.exe ausgelesen wurden. Das Problem ist eindeutig wenn der Verschlüsselt gespeicherte String eine Länge von von 256 Zeichen erreicht.
    Selbst wenn ich nur aaaaa's verschlüssele kommt die Exception beim Sprung einer Länge von 236 auf 256 Zeichen.

    Der Fehler wird durch

    C#-Quellcode

    1. byte[] bArr = Convert.FromBase64String(cryptstr)
    ausgelöst.

    In VB sieht's so aus

    VB.NET-Quellcode

    1. Dim bArr() as Byte = Convert.FromBase64String(cryptstr)
    und hier läuft's auch mit deutlich längeren Strings.

    Das heißt ja im Grunde das ich das so gar nicht übersetzen kann oder C# ein Downgrade bekommen hat.
    Ich frage mich wie das jetzt zu Händeln ist.
    Das Chaos beginnt mit komprimierter Ordnung (Steppenpferd 2019)
    @Steppenpferd Poste mal einen in sich geschlossenen Code, der den Effekt reproduziert.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Steppenpferd Ich hab mal ein kleines Testprogramm geschrieben, das läuft im Studio 19 in Win10 im Framework 4 und 4.72.
    Form mit Button und ListBox:
    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Linq;
    3. using System.Windows.Forms;
    4. namespace TestIpControl
    5. {
    6. public partial class Form1 : Form
    7. {
    8. public Form1()
    9. {
    10. this.InitializeComponent();
    11. }
    12. private void button1_Click(object sender, EventArgs e)
    13. {
    14. for (int i = 200; i <= 300; i++)
    15. {
    16. bool equal = CheckArray(i);
    17. listBox1.Items.Add($"{i} {equal}");
    18. }
    19. }
    20. private bool CheckArray(int count)
    21. {
    22. byte[] by1 = new byte[count];
    23. for (int i = 0; i < by1.Length; i++)
    24. {
    25. by1[i] = 0xaa;
    26. }
    27. string txt = System.Convert.ToBase64String(by1);
    28. byte[] by2 = System.Convert.FromBase64String(txt);
    29. return by1.SequenceEqual(by2);
    30. }
    31. }
    32. }
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Steppenpferd schrieb:

    Das heißt ja im Grunde das ich das so gar nicht übersetzen kann oder C# ein Downgrade bekommen hat.

    Der Fehler muss auf deiner Seite sein. Ich habe mit C# schon für einen SQL-Abzug nach CSV-Dateien Gigabyte weise Binärdaten als Base64 abgelegt und wieder hergestellt.

    RodFromGermany schrieb:

    Poste mal einen in sich geschlossenen Code, der den Effekt reproduziert.
    Wie Rod sagt, versuch das mal mit einem kleinen Projekt nachzustellen. Vermutlich ist das irgendeine Kleinigkeit. Z.B. Arrays funktionieren in C# ja etwas anders. Beim deklarieren gibt man die Länge an, nicht den maximal Index und es startet bei 0.
    @RodFromGermany es liegt an der Verschlüsselung. Hab die Übersetzung mehrfach geprüft und auch mal durch einen Übersetzer laufen lassen. Der Code wurde richtig übersetzt, Funkt aber in C# bei einem Array dessen Größe 256 Bytes überschreitet nicht.
    Habe jetzt für C# eine neue Verschlüsselung und passend dazu einen Konverter in VB.net geschrieben.
    Mit der neuen Verschlüsselung Funkt es Wunderbar und mit der Konvertierung für den anderen PC kann ich leben, da ich das Programm eh nur Privat nutze.
    Danke für das Testprogramm, werde es Morgen mal durchlaufen lassen. Kann VS für Heute nicht mehr sehen...
    Das Chaos beginnt mit komprimierter Ordnung (Steppenpferd 2019)
    @Steppenpferd Poste bitte ein Beispiel, wo der Formalismus nicht funktioniert!
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany Hier das Debug
    Spoiler anzeigen
    ​try start
    string length= 24
    0qZN8nFAKwfH+4PE4BI6qw==

    after convert
    after cs write
    after cs flush
    after cs close
    after decrypt
    after ms close

    try start
    string length= 24
    2Cn+lsY4wB6PF9rKw6AsnA==

    after convert
    after cs write
    after cs flush
    after cs close
    after decrypt
    after ms close

    try start
    string length= 254
    nIeiZK/F5uadQK9/m09uVE8fbMiLpAU7J5dmk9V//P/07ijveVekD2wMq90APOC2Na4zCgXNGIn5mqkGfeWBbQB+4K9nspxLlpxncYJw6kpAFk5wqeFmfHZwDQazn9QDxix/OOaqFQ98uxOKE2Sg1zIAjbcIoxx0tEK9sQw7NvhFym6zpCq21OfzTX8AcTdgHv6sU11KAr9d557f4Kn5lNt0n8S4FfSUk02lFahqb7wqHryHNdpdslvaCpwJ4O

    "side.exe" (CLR v4.0.30319: side.exe): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_de_b77a5c561934e089\mscorlib.resources.dll" geladen. Das Modul wurde ohne Symbole erstellt.
    Ausnahme ausgelöst: "System.FormatException" in mscorlib.dll

    exception: Ungültige Länge für Base-64-Zeichenarray oder -Zeichenfolge.


    Der gleiche String wurde mit diesem 2 Zeiler getestet und löst die Exception ebenfalls aus
    Spoiler anzeigen

    C#-Quellcode

    1. string enc = "nIeiZK/F5uadQK9/m09uVE8fbMiLpAU7J5dmk9V//P/07ijveVekD2wMq90APOC2Na4zCgXNGIn5mqkGfeWBbQB+4K9nspxLlpxncYJw6kpAFk5wqeFmfHZwDQazn9QDxix/OOaqFQ98uxOKE2Sg1zIAjbcIoxx0tEK9sQw7NvhFym6zpCq21OfzTX8AcTdgHv6sU11KAr9d557f4Kn5lNt0n8S4FfSUk02lFahqb7wqHryHNdpdslvaCpwJ4O";
    2. byte[] bArr = Convert.FromBase64String(enc);


    Und hab den Fehler grade gefunden. Der liegt nicht beim Decrypten sondern beim Laden.
    Der StringBuilder hat in C# eine Defaultlänge von 255 und in VB.Net 2048 Bytes. Wie Dumm :/
    Das Chaos beginnt mit komprimierter Ordnung (Steppenpferd 2019)
    @Steppenpferd Kann es sein, dass Du den Base64String falsch verwendest?
    Primat ist ein Byte-Array.
    Dieses wird in einen Base64String konvertiert.
    Dieser Base64String ist unabhängig von der verwendeten Kultur immer gleich.
    Wenn dann der Base64String zurück in ein Byte-Array konvertiert wird, ist dieses gleich dem Ausgangsfeld.
    ====
    Ich bat Dich um ein Beispiel, wo das bei Dir nicht funktioniert.
    Ich meine damit, dass Du einen in sich geschlossenen Code postest, das sieht dann so aus, wie ich es Dir in Post #5 gepostet habe.
    Das bedeutet:
    Du postest Code, wir fügen diesen Deinen Code in unser Testprojekt ein, starten das Projekt und der Effekt findet statt.
    Das bedeutet also, dass zuerst ein Byte-Array stehen muss.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Steppenpferd schrieb:

    Und hab den Fehler grade gefunden. Der liegt nicht beim Decrypten sondern beim Laden.
    Der StringBuilder hat in C# eine Defaultlänge von 255 und in VB.Net 2048 Bytes. Wie Dumm :/


    In C# wurde der String mit einer Länge von max. 255 Bytes eingelesen, gespeichert wurde der String jedoch im Original VB.Net Programm mit einer Länge größer als 255 Bytes.
    Habe nun in C# beim einlesen des Strings den Default-Wert erhöht und alles läuft, auch mit der alten Verschlüsselung.
    Das Chaos beginnt mit komprimierter Ordnung (Steppenpferd 2019)
    @Steppenpferd Da hast Du einen krassen Effekt gefunden. :thumbup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!