locked
Eine Zeichenkette mit XOR manipulieren, die Wiederherstellung gelingt jedoch nicht RRS feed

  • Allgemeine Diskussion

  • Hallo,

    Folgende Text wollte ich testweise mit einer anderen Zeichenkette XOR-verknüpfen:

    ABCDEFGHIJKLMNOPQRSTUVWXYZ

    abcdefghijklmnopqrstuvwxyz

    1234567890

    !"§$%&/()=?

    ,.-;:_

    {[]}\

    mittels  folgender Schleife:

    StreamReader ^Vorher=gcnew StreamReader(DateiVorher); //Vorher ist UTF-8
    StreamWriter ^Nachher=gcnew StreamWriter(DateiNachher); //Unicode UTF-8
    StringBuilder ^Zeile;
    while (Vorher->EndOfStream==false)
    {
     Zeile=gcnew StringBuilder(Vorher->ReadLine());
     for (i=0; i<Zeile->Length; i++) {Zeile[i] =Zeile[i] ^ Text[i];} //Text ist String UTF-8, über CurrentEncoding getestet
     Nachher->WriteLine(Zeile);
    }

     Das Ergebnis wieder mit Text XOR verknüpft sollte eigentlich die ursprüngliche Zeichenkette ergeben, stattdessen sind die Kleinbuchstaben nicht wiederhergestellt:

    ABCDEFGHIJKLMNOPQRSTUVWXYZ

    abcdef
    ,or?Bf
    Fx>}r4l:6tr

    1234567890

    !"§$%&/()=?

    ,.-;:_

    {[]}\

    Wo ist der Haken?

    Gruß Tom

    Montag, 12. März 2012 18:45

Alle Antworten

  • Sind es wirklich immer die kleinen Buchstaben, die Probleme machen? Oder hängt das Verhalten von dem Array Text[] ab? (z.B. wenn dieser große Buchstaben enthält?)

    Ich würde ja vermuten, dass es am Unicode liegt: Während intern der String als 2-Byte-Zeichenkette gespeichert wird, wird der String beim Speichern in eine UTF-8-Kodierung mit variabler Zeichenlänge umgewandelt. Aber niemand garantiert, dass jedem der 65536 möglichen Werte eines 2-Byte-Zeichens auch ein UTF-8-Zeichen zugeordnet ist...

    Ich sehe noch ein Problem in deinem Code, welches auch bei Ascii auftreten würde: wenn durch die XOR-Operation z.B. ein Newline-Character rauskommt, dann endet dein String beim Einlesen aus der Datei an dieser Stelle.

    Mein Vorschlag: Speichere deinen String besser binär als array<Char>.

    Alex

    Dienstag, 13. März 2012 22:11
  • Hallo Alex,

    genau das wars: g XOR m ergibt NewLine, mein verflixtes g!

    Danke und Gruß

    Mittwoch, 14. März 2012 10:02
  • Bitte zukünftig Cross-Post vermeiden:

    http://social.msdn.microsoft.com/Forums/de-DE/visualcclide/thread/5e437bc9-4f08-4a09-b4ce-26e8b5ac770d


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de

    Mittwoch, 14. März 2012 12:05
    Moderator