PChar ist ein dynamischer Typ, welcher sich mit dem Compiler anpasst.
Wenn sich also die Daten im MemoryStream nicht in ihrem Format geändert haben, ist und war schon immer PAnsiChar das Richtige.
Und man mag es nicht glauben, aber wenn du im Debugger mal nachsehn würdest, dann würdest du mitbekommen, was bei PChar für ein Text aus dem Stream ausgelesen wird.
Mauszeiger hinter die Klammer vom
PChar(...)
, also zwischen das
))
, oder das
PChar(MyStream.Memory)
in die "Überwachten Ausdrücke" rein.
Oder per ShowMessageDebugging
ShowMessage(PChar(MyStream.Memory));
.
Da es sich hier aber nicht wirklich um einen PAnsiChar handelt und um die Möglichkeit einer Zugriffsfehlers auszuschließen, denn das passiert schnell mal, wenn in der Datei kein #0 vorkommt, solltest du das auch nicht als PAnsiChar auswerten.
Und spaßig ist es, wenn du eine sehr große Datei da drin hast, welche keine #0 enthält, dann wird erstmal versucht alles in einen AnsiString umzuwandeln, welches an Pos übergeben wird. Ein OutOfMemry wäre doch nett?
Delphi-Quellcode:
type
TMyRecord = array[0..3] of AnsiChar;
PMyRecord = ^TMyRecord;
var
X: array[0..3] of AnsiChar;
MyStream.Position := 0;
if (MyStream.Read(X, 4) = 4) and (X = '%PDF') then // vielleicht auch (AnsiString(X) = '%PDF') oder CompareMemory mit dem nächsten X
X := '%PDF';
if (MyStream.Size >= 4) and CompareMemory(@X, MyStream.Memory, 4) then
if (MyStream.Size >= 4) and (PMyRecord(MyStream.Memory)^ = '%PDF') then
Und es gibt noch viele weitere Möglichkeiten.
PS: Es gibt inzwischen viele neue und praktische Funktione (vorallem in der StrUtils), welcher man statt Pos inzwischen verwenden darf und die richtlich das Prüfen, was man eigentlich prüfen wollte.
if StartsStr('%PDF', PAnsiChar(MyStream.Memory)) then
(auch wenn es hier Speicherzugriffstechnisch die selben Probleme gäbe, wie beim Pos, da es den selben PAnsiChar-Zugriff gibt)