none
Problem mit "string" als Rückgabewert RRS feed

  • Frage

  • Hallo,

    ich habe in folgendem Code ein Problem, das ich nach vielem hin und her probieren immer noch nicht lösen konnte. Vielleicht hat jemand eine Erklärung, warum das Problem auftritt:

    string text = "abc";
    string text2 = getTheString(); //Eigene Methode. Liefert auch "abc" zurück.
    MessageBox.Show(text);  //Ausgabe "abc"
    MessageBox.Show(text2); //Ausgabe "abc"
    MessageBox.Show(text + "abc");  //Ausgabe "abcabc"
    MessageBox.Show(text2 + "abc"); //Ausgabe "abc". WARUM aber nicht "abcabc"? 

    Dieses Problem ist mir beim Verschlüsseln eines Textes aufgetreten. Der Text "abc" wird zunächst verschlüsselt und dann in eine Binär-Datei byteweise geschrieben. "getTheString()" liest die Binär-Datei byteweise aus und entschlüsselt den Text.

    Alles funktioniert soweit, "getTheString()" liefert auch "abc" zurück. Irgendwie verhält sich der Rückgabewert, der dann in die Variable "text2" geschrieben wird, aber komisch (siehe letzte Codezeile). Hat jemand eine Idee, warum der string "text2" zwar den Wert "abc" hat, sich aber ganz anders verhält als "text"? Was können die Ursachen dafür sein?

    Ich würde mich über eine Antwort freuen!

    MfG Josef


    • Bearbeitet User95 Sonntag, 12. April 2015 17:50
    Sonntag, 12. April 2015 17:49

Antworten

  • Hallo,

    ja, die 0-Chars sind das Problem. Diese werden in C# auch mit "\0" in einen String eingefügt. Sie dienen dem System dazu zu erkennen wenn ein String zu Ende ist. Da Windows beim erstellen der MessageBox denkt das der String hinter abc zu Ende ist, wird def nicht mehr ausgegeben.

    Sicher wäre es möglich die Nullen nachträglich zu entfernen, besser wäre jedoch den Fehler beim dekodieren zu finden. Denn wenn du "abc" hinein schickst und du "abc\0\0\0\0\0" erhältst, funktionieren deine Methoden nicht wie angedacht.

    Eine Möglichkeit wo die Nullen her kommen ist, das du ein Array deklarierst und einige Felder darin nicht zuweist:

    var x = new Byte[3];
    x[0]=1;
    x[1]=2;
    
    //x[2] ist 0...
    Beim zurück Konvertieren verursachen die 0en dann Probleme.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort vorgeschlagen Jochen Gast Montag, 13. April 2015 05:09
    • Als Antwort markiert User95 Montag, 13. April 2015 06:02
    Sonntag, 12. April 2015 19:34
    Moderator

Alle Antworten

  • Hmm, wenn deine Methode getTheString() wirklich funktionieren sollte, dann müsste es so laufen.

    Versuch doch mal einen Break-Point vor der letzten Zeile zu setzen, um den Wert von text2 anschauen zu können. Dazu kannst du unten (in Visual Studio) die Ansicht lokale Variablen verwenden.


    © 2015 Thomas Roskop

    Germany // Deutschland

    Sonntag, 12. April 2015 18:16
  • Hallo,

    wenn dir die 2. MessageBox abc anzeigt, ist auch abc in text2 enthalten. Aber was zeigt es an, wenn du folgenden Befehl ausführst?

    MessageBox.Show(text2 + "def");
    Ich vermute, das auch hier wieder nur abc erscheint. Ich denke das text2 einen Speziellen Wert enthält, der den Rest des Strings nicht sichtbar macht. Lasse dir daher mal die Byte-Codes ausgeben, die die Zeichen in text2 haben:
    MessageBox.Show(string.Join("\n", text2.ToCharArray().Select(x=>(int)x));



    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Sonntag, 12. April 2015 18:42
    Moderator
  • Hallo,

    Wenn ich den Befehl

    MessageBox.Show(text2 + "def");

    ausführe, bekomme ich auch nur "abc" angezeigt.

    Folgende Byte-Werte erhalte ich für den Inhalt in "text2":

    97
    98
    99
    0
    0
    0
    0
    0

    Und folgende Byte-Werte erhalte ich für den Inhalt in "text":

    97
    98
    99
    Meinst du, dass die 5 nullen in "text2" das Problem auslösen? Die sind womöglich dadurch entstanden, dass ich byteweise gespeichert habe. Wenn ja, gibt es eine einfache Möglichkeit solche "Null-Chars" am Ende eines Strings abzuschneiden?

    Sonntag, 12. April 2015 19:29
  • Hallo,

    ja, die 0-Chars sind das Problem. Diese werden in C# auch mit "\0" in einen String eingefügt. Sie dienen dem System dazu zu erkennen wenn ein String zu Ende ist. Da Windows beim erstellen der MessageBox denkt das der String hinter abc zu Ende ist, wird def nicht mehr ausgegeben.

    Sicher wäre es möglich die Nullen nachträglich zu entfernen, besser wäre jedoch den Fehler beim dekodieren zu finden. Denn wenn du "abc" hinein schickst und du "abc\0\0\0\0\0" erhältst, funktionieren deine Methoden nicht wie angedacht.

    Eine Möglichkeit wo die Nullen her kommen ist, das du ein Array deklarierst und einige Felder darin nicht zuweist:

    var x = new Byte[3];
    x[0]=1;
    x[1]=2;
    
    //x[2] ist 0...
    Beim zurück Konvertieren verursachen die 0en dann Probleme.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort vorgeschlagen Jochen Gast Montag, 13. April 2015 05:09
    • Als Antwort markiert User95 Montag, 13. April 2015 06:02
    Sonntag, 12. April 2015 19:34
    Moderator