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

user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:



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 ;-)