Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi hagen reddman dec Umlaute MD5 (https://www.delphipraxis.net/170966-hagen-reddman-dec-umlaute-md5.html)

Pro_RJ 12. Okt 2012 14:59

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:
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;
Bei "normalen" Strings ohne Umlaute stimmt das Ergebnis, nur bei umlauten kommt eben ein falsches Ergebnis.
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

Delphi-Laie 12. Okt 2012 15:20

AW: hagen reddman dec Umlaute MD5
 
Zitat:

Zitat von Pro_RJ (Beitrag 1186794)
aber das Ergebnis ist immer das gleiche

Wenn die Ergebnisse zweier Programmautoren und bei drei verschiedenen Datentypen immer die gleichen sind, was macht Dich dann so sicher, daß sich beide Programmautoren irrten - und dann anscheinend noch mit demselben Fehler? Zwei gegen einen?!

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.

Bernhard Geyer 12. Okt 2012 15:21

AW: hagen reddman dec Umlaute MD5
 
Versuch mal die UTF8-Variante deines Strings.

p80286 12. Okt 2012 16:18

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

Pro_RJ 12. Okt 2012 19:01

AW: hagen reddman dec Umlaute MD5
 
Danke für die Antworten.
1.
Zitat:

Zitat von Delphi-Laie (Beitrag 1186797)
Zitat:

Zitat von Pro_RJ (Beitrag 1186794)
aber das Ergebnis ist immer das gleiche

Wenn die Ergebnisse zweier Programmautoren und bei drei verschiedenen Datentypen immer die gleichen sind, was macht Dich dann so sicher, daß sich beide Programmautoren irrten - und dann anscheinend noch mit demselben Fehler? Zwei gegen einen?!

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.

Das ganze hat einen Hintergrund :-)
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:
B := $F6
dann ist die darstellung bzw. die Formatierung eigentlich egal. Oder hab ich das nicht richtig verstanden?

Furtbichler 13. Okt 2012 08:00

AW: hagen reddman dec Umlaute MD5
 
Zitat:

Zitat von Pro_RJ (Beitrag 1186824)
Daher bin ich mir sicher, das die 2 Tools, das nicht korrekt berechnen.

Das ist eben falsch. :stupid:

Die richtige Schlußfolgerung ist: Der Input ist unterschiedlich. Ein ö ist eben kein ö.

Pro_RJ 13. Okt 2012 08:43

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?

himitsu 13. Okt 2012 10:28

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

Pro_RJ 13. Okt 2012 21:37

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:
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;
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.
Müsste ich dann den Stream erst wieder in UTf8 Konvertieren und dann den MD5 berechnen oder geht das nicht auch irgendwie einfacher?

himitsu 13. Okt 2012 23:15

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 08:23 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz