![]() |
Delphi-Version: 2006
hagen reddman dec Umlaute MD5
Hallo,
ich versuche gerade einen MD5 von einem Sting zu erstellen. Leider erhalte ich bei Umlauten (ä,ü,ö) ein falsches Ergebnis. Ich verwende die DEC von Hagen Reddmann, bzw. den CRC von Wolfgang Ehrhardt und ich vergleiche das Ergebnis mit diversen "Online-Md5-Rechnern" ich verwende dabei folgenden Code,
Delphi-Quellcode:
Bei "normalen" Strings ohne Umlaute stimmt das Ergebnis, nur bei umlauten kommt eben ein falsches Ergebnis.
Var B : Byte;
begin B := byte('ö'); // Hier ist B = Decimal 246 ist OK kleines oe // Label1.Caption := THash_MD5.CalcStream(Str,Str.size,TFormat_HEX); Label1.Caption := THash_MD5.CalcBinary('ö',TFormat_HEX); // Richtig wäre a172480f4e21d0a124bac19c89569c59 (lt Internet) // Berechnet ist 44F2C50B838F92970D2C11E2FA98BC7D end; Ich habe bereits getestet : Das "ö" als String , Das "ö" als Decimal 246, Das "ö" als Hex F6 aber das Ergebnis ist immer das gleiche Woran kann das liegen bzw. wie kann ich den Fehler beheben? Ich verwende BDS 2006 und lie Libs von Hagen Reddmann,Wolfgang Ehrhardt |
AW: hagen reddman dec Umlaute MD5
Zitat:
Ansonsten rege ich an, beide anzuschreiben (wenigstens auf diese Diskussion hinzuweisen, vielleicht äußern sie sich ja öffentlich), denn das ist so speziell und beide so eingearbeitet, daß sie die besten "Auskunfteien" dafür sind. |
AW: hagen reddman dec Umlaute MD5
Versuch mal die UTF8-Variante deines Strings.
|
AW: hagen reddman dec Umlaute MD5
In der grauen Vorzeit (vor UTF8,16....) wurden einem Wert je nach Codepage unterschiedliche Zeichen(Bedeutungen) zugewiesen.
Wenn du Den MD5 mit einem solchen (üöäß§...) fütterst, kommt je nach verwendeter codepage etwas anderes bei der MD5-Routine an. Letztendlich werden Wert-ketten und keine Texte verarbeitet. Gruß K-H |
AW: hagen reddman dec Umlaute MD5
Danke für die Antworten.
1. Zitat:
Die Daten stammen aus einer Datenübertragung an Amazon ( wo in diversen Artikelbeschreibungen diese umlaute enthalten sind). Hier wird eben dieser MD5 benötigt. Lasse ich den MD5 mit einem beliebigen Online-Rechner berechnen ist der MD5 richtig.Also als Ergebnis kommt genau das raus, was Amazon auch errechnet und auch benötigt. Lasse ich die anfrage aber eben über diese Tools errechnen komme ich auf einen anderen MD5. Nach langem suchen und vergleichen bin ich eben darauf gekommen, das es an den Umlauten liegt. Dann habe ich es speziell auf die Umlaute getestet und bin drauf gekommen, das da eben nicht das erwartet Ergebnis errechnet wird.Daher bin ich mir sicher, das die 2 Tools, das nicht korrekt berechnen. 2. Das mit der Formatierung verstehe ich nicht, die Berechnung vom MD5 ist doch eine eine Bit-weise Verknüpfung? (ich muss gestehen, das ich die eigentliche berechnungslogik noch nicht verstanden habe) bzw wie soll ich die Formatierung ändern? im BDS2006 ist ein String ja noch KEIN Unicode. Und wenn ich die übergabe als Byte Deklariere also
Delphi-Quellcode:
dann ist die darstellung bzw. die Formatierung eigentlich egal. Oder hab ich das nicht richtig verstanden?
B := $F6
|
AW: hagen reddman dec Umlaute MD5
Zitat:
Die richtige Schlußfolgerung ist: Der Input ist unterschiedlich. Ein ö ist eben kein ö. |
AW: hagen reddman dec Umlaute MD5
Ok aber wie kann ich dann die eingabe berichtigen? so das ein "ö" eben ein "ö" ist also Hex F6 oder Dezimal 246?
|
AW: hagen reddman dec Umlaute MD5
Wenn bei dir der String ein AnsiString ist und wenn dein Windows (die aktive CodePage in deinem Programm) die Deutsche ist,
dann "stimmt" bei dir das mit dem "ä" schon. Die Frage ist dann eher, wie machen die Webseiten das, also was verwenen die für eine Codepage, bzw. welches Encoding nutzen sie. probier mal AnsiToUtf8 |
AW: hagen reddman dec Umlaute MD5
Danke für die Tips,
ich habe jetzt auch erste Ergebnisse, Also wenn ich die Strings in UTF8 umwandel ist alles ok, Danke. Allerdings funktioniert das leider nicht mit Buffern( also Array of byte) da die länge nicht mehr passt. oder mache ich bei bei der Umwanddlung einen Fehler?
Delphi-Quellcode:
Die Daten die ich per MD5 berechnen möchte stammen aus einem XML-Dokument (TXMLDocument) hier ist in der Formatierung UTF8 angegeben.Wenn das XML-Dokument fertig erzeigt ist wird alles per SaveToStream gespeichert und dieser Stream wird dann in einen Buffer geladen und aus diesem Buffer wid dann der MD5 berechnet.
Var // Str : TMemorystream;
B : Array of Byte; s : RawByteString; le : Integer; begin // s := UTF8Encode(memo1.lines.text); s := AnsiToUtf8(memo1.lines.text); le := length(S); setlength(B,le); move(s,B,le); // B := byte('ö'); // Hier ist B = Decimal 246 ist OK kleines oe // Label1.Caption := THash_MD5.CalcStream(Str,Str.size,TFormat_HEX); Label1.Caption := THash_MD5.CalcBuffer(b,le ,TFormat_HEX); // Label1.Caption := THash_MD5.CalcBinary(S,TFormat_HEX); // Richtig wäre a172480f4e21d0a124bac19c89569c59 (lt Internet) // Berechnet ist 44F2C50B838F92970D2C11E2FA98BC7D end; Müsste ich dann den Stream erst wieder in UTf8 Konvertieren und dann den MD5 berechnen oder geht das nicht auch irgendwie einfacher? |
AW: hagen reddman dec Umlaute MD5
Dein Fehler ist die falsche Verwendung von MOVE.
So wie du es jetzt machst, kopierst du die internen Zeiger der Arrays/String und nicht den Inhalt im String/Array.
Delphi-Quellcode:
Move(S[1], B[0], le);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz