Entwickler-Ecke
Off Topic - Fehler, die man gerne hat
Gausi - Di 22.12.09 14:57
Titel: Fehler, die man gerne hat
Es gibt ja so Fehler, die sind so richtig klasse. Weil man sie so schnell findet. Weil sie sich da verstecken, wo man sie sofort vermutet.
Hier ist mal wieder so einer. Ich habe eine MD5-Unit um eine Funktion erweitert, die den Hash eines Unicode-Strings unter Delphi 2009 berechnet.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| function MD5String(const S: AnsiString): TMD5Digest; begin Result:=MD5Buffer (PAnsiChar(S)^, Length(S)); end;
function MD5UnicodeString(const S: UnicodeString): TMD5Digest; begin Result:=MD5Buffer(PChar(S)^, Length(S) * sizeOf(PChar)); end; |
Na, wer findet den Fehler in der zweiten Funktion? :autsch:
(Das Thema ist Off-Topic - seht es als kleines Extra-Rätsel an. ;-))
Niko S. - Di 22.12.09 15:02
Achne wäre blöd ... Edit//
Xentar - Di 22.12.09 15:50
Delphi-Quelltext
1:
| SizeOf(PChar) <> SizeOf(UnicodeChar) |
?
PChar is'n Pointer -> 4 Byte
UnicodeChar hat doch afaik nur 2 byte, oder?
Oder kann man sich das sizeof ganz sparen, und nur length() verwenden *grübel* kA, hab kein D2009 :D
Boldar - Di 22.12.09 15:56
Gausi hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| function MD5String(const S: AnsiString): TMD5Digest; begin Result:=MD5Buffer (PAnsiChar(S)^, Length(S)); end;
function MD5UnicodeString(const S: UnicodeString): TMD5Digest; begin Result:=MD5Buffer(PChar(S)^, Length(S) * sizeOf(PChar)); end; |
|
Was gibs zu gewinnen?
Gausi - Di 22.12.09 16:00
Ja, korrekt wäre da SizeOf(Char) gewesen. Das erste PChar(S)^ ist aber richtig.
Unter D2009 ist ein PChar ein PWideChar. Aber ein PChar hat als Pointer nunmal ne Größe von 4 Bytes. Damit wird die MD5-Summe von einem zu großen Bereich ermittelt und ich bekomme beim selben String schonmal unterschiedliche Ergebnisse.
Zu gewinnen gibt es: Mal überlegen...nix. :mrgreen:
Niko S. - Di 22.12.09 16:21
LOL ich hab genau das geschrieben aber dachte das wäre schwachsinn... Oh man.. <_< Peinlich *Mir in den A**** beiß*
BenBE - Di 22.12.09 16:36
Haben die etwa inkonsequenter-weise String=WideString, AnsiString und Unicode-String geschaffen, aber nur für AnsiString und WideString die entsprechenden PAnsiChar- und PWideChar-Pointer-Typen?
Sagen wir's aber so: PChar, "PUnicodeChar" und PWideChar zeigen zwar auf den Anfang und sind somit alle von vom Effekt her richtig, haben rein typenmäßig aber unterschiedliche Bedeutungen ... Streng genommen würde ich das PChar in der zweiten Funktion also auch noch als falsch anmeckern ;-)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!