| Autor |
Beitrag |
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Di 22.12.09 14:57
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?
(Das Thema ist Off-Topic - seht es als kleines Extra-Rätsel an.  )
_________________ We are, we were and will not be.
|
|
Niko S.
      
Beiträge: 566
Erhaltene Danke: 10
Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
|
Verfasst: Di 22.12.09 15:02
Achne wäre blöd ... Edit//
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: 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 
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: 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 
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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. 
_________________ We are, we were and will not be.
|
|
Niko S.
      
Beiträge: 566
Erhaltene Danke: 10
Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
|