Einzelnen Beitrag anzeigen

Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Delphi 2010 + MD5 von File

  Alt 5. Okt 2009, 21:33
Zitat von h4zZ:
DANKE! Es geht! Habe dein Edit erst jetzt gesehen.. Kannst du mir vielleicht auch den Hintergrund nennen, wieso es nur mit pAnsiChar geht?
Vor Delphi 2009 was PChar gleichbedeutend mit PAnsiChar. Mit Delphi 2009 und der Umstellung auf Unicode ist PChar jetzt ein PWideChar.

Dadurch das ein WideChar aber 2 Byte groß ist, ein AnsiChar aber nur 1, verändert sich die Pointer Arithmetik. Wenn Du einen Pointer um einen Wert inkrementierst, verschiebt sich die Adresse um die Größe des Datentyps auf den der Pointer zeigt. Bei den alten PAnsiChars bedeutet das, daß ein Inkrement um 1 die Adresse um 1 Byte erhöht hat. Ein Inkrement um 1 bedeutet beim PWideChar aber eine Adresserhöhung von 2.

Wenn man sich jetzt die Funktion ansieht, sieht man einige Fälle von Pointer Arithmetik (Zeile 19 und 24):
Delphi-Quellcode:
procedure MD5Update(var Context: MD5Context; Input: pAnsiChar; Length: longword);
var
   Index: longword;
   PartLen: longword;
   I: longword;
begin
   with Context do begin
      Index := (Count[0] shr 3) and $3f;
      inc(Count[0], Length shl 3);
      if Count[0] < (Length shl 3) then inc(Count[1]);
      inc(Count[1], Length shr 29);
   end;
   PartLen := 64 - Index;
   if Length >= PartLen then begin
      CopyMemory(@Context.Buffer[Index], Input, PartLen);
      Transform(@Context.Buffer, Context.State);
      I := PartLen;
      while I + 63 < Length do begin
         Transform(@Input[I], Context.State);
         inc(I, 64);
      end;
      Index := 0;
   end else I := 0;
   CopyMemory(@Context.Buffer[Index], @Input[I], Length - I);
end;
Der von Arrays bekannte [] Operator entspricht dabei einem Inkrement mit I. Ist Input PWideChar verschiebt sich dadurch der Pointer aber nicht um I Stellen nach oben, sondern um I*2 Stellen. Das bewirkt, daß ausserhalb des eigentlichen Buffers gelesen wird und es gibt die Zugriffsverletzung. Bin grade ein wenig im Streß, daher sorry wenns ein wenig kompliziert klingen mag. Wenn ich mehr Zeit hab, lass ich mir ein etwas einfacher zu verstehendes Beispiel einfallen.
Fridolin Walther
"While Mr. Kim, by virtue of youth and naiveté, has fallen prey to the inexplicable need for human contact, let me step in and assure you that my research will go on uninterrupted, and that social relationships will continue to baffle and repulse me."
  Mit Zitat antworten Zitat