Laden...

Byte --> String --> Byte erzeugt falsche Bytes...

Erstellt von der Marcel vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.186 Views
der Marcel Themenstarter:in
564 Beiträge seit 2006
vor 18 Jahren
Byte --> String --> Byte erzeugt falsche Bytes...

Hi Leute!

Hab ein mittelschweres Problem. Ich versuche eine Datei zu schreiben, welche an bekannter Byte-Position Ihre Erstellungszeit als MD5-Hash abspeichert. Später wird dieser Hash-Werte ausgelesen und mit dem verglichen, der aus der Erstellungszeit der Datei erstellt wird, verglichen. (Ist so eine Art Kopierschutz, damit die Datei nach wegkopieren nicht mehr als korrekt identfiziert werden kann) Jetzt ist es mein Problem, dass ich über einen Funktionsaufrufden MD5-Hash erzeuge und den als String zurückgebe. Das geschieht mit:

private string GetMD5Hash(string plaintext)
        {
            MD5 MD5Hasher = MD5.Create();
            byte[] plaintextByte = Encoding.Default.GetBytes(plaintext);
            byte[] MD5Text = MD5Hasher.ComputeHash(plaintextByte);
            StringBuilder BuildString = new StringBuilder();

            for (int count = 0; count < MD5Text.Length; count++)
                BuildString.Append((char)Convert.ToInt32(MD5Text[count].ToString()));

            MD5Hasher.Clear();
            return BuildString.ToString();
        }

Um den letztenendes im Filestream abzuspeichern, wird der Wert wieder Bytes konvertiert. Genau da passiert bei einigen Zeichen der Fehler, dass die (falsche) binäre 63 in das Byte-Array geschrieben wird.

Woran liegt das?

Das Rückkonvertierung erfolgt mit:

TicksStringByteMD5 = Encoding.Default.GetBytes(TicksStringMD5);

Danke für eure Antworten!

Gruß, Marcel

:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo der Marcel,

das Problem liegt vermutlich darin, dass beim schreiben ein anderes Encoding verwendet wird als beim Lesen. Aber der ganze Ansatz ist murx. Schreib und lies die Bytes als Bytes (FileStream.Write/Read)! Momenatan machst du Bytes -> String -> Bytes -> String -> Bytes statt Bytes -> Bytes, mit all den damit verbundenen Problemen.

herbivore

der Marcel Themenstarter:in
564 Beiträge seit 2006
vor 18 Jahren

Danke! Daran liegt es tatsächlich... ich muss natrülich beim Encodieren und Decodieren jedesmal die Unicode-Codierung verwenden, sonst wird es Datenmüll 🙂
Leider wird bei der Unicode Encodierung, das Byte-Array grundsätzlich richtig, aber doppelt so groß...Jedes 2. Element ist dann eine 0?? Wie kann das sein?

Werd natürlich die String-Umwandlung rauslassen und die Bytes direkt schreiben, das spart ärger. Hatte es über Strings eingebunden, da ich mir bei der Überprüfung die zwischenzeitlich erzeugten Hash-Werte zum Debuggen ausgeben lassen wollte, um zu sehen, ob ich beim logischen Vergleich was falsch mache.

Gruß, Marcel

:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo der Marcel,

Wie kann das sein?

na eben, weil du in Unicode codierst. Da wird jedes Zeichen durch einen zwei-byte Zeichencode repräsentiert.

herbivore