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 😁 :]
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
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 😁 :]
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