Sie können in Delphi genau das tun, was Sie in C++ tun würden. Definieren Sie jedoch einen benannten Typ für den Datensatzzeiger, da Sie mit Delphi keine Typen in Anweisungen definieren können.
type
PPacket = ^TPacket;
var
packet: PPacket;
packet := PPacket(@data[0]);
Der Grund, warum ich @data[0]
verwendet habe, ist, dass es funktioniert unabhängig davon, ob Daten ein dynamisches Array ist. Wenn es sich um ein dynamisches Array ist, dann ist data
wirklich ein Zeiger auf das erste Byte des Pakets, so dass dies funktionieren würde:
packet := PPacket(data); // for dynamic array only
Aber wenn data
ist nicht ein dynamisches Array, dann wird diese Art Guss gewonnen‘ t sei gültig.
packet := PPacket(@data); // for static array only
Das wird nicht funktionieren, wenn es sich um ein dynamisches Array ist: Sie würden stattdessen einen Zeiger zu data
, wie diese benötigen geben Guss. Der erste Code wird in beiden Fällen funktionieren. Aber wenn Sie Bereichsprüfung aktiviert haben (und Sie sollten wahrscheinlich), dann denke ich, der erste Code wird eine Ausnahme auslösen, wenn data
ist eine Null-Länge dynamische Array, also sei vorsichtig.
Wenn Sie die C# route stattdessen gehen wollen, wo Sie die Bytes aus dem Array in eine separate TPacket
Variable zu kopieren, dann würde ich diese verwenden:
var
packet: TPacket;
// Source param comes first. Params are passed by
// reference automatically.
Move(data[0], packet, SizeOf(packet));
Sie‘ Ich muss sicherstellen, dass data
genug Bytes enthält, um einen gesamten Wert zu füllen.TPacket
sollte besser keine vom Compiler verwalteten Typen wie string
, Variant
, IUnknown
oder dynamische Array-Typen enthalten. Weder Zeiger-Casting noch verhalten sich gut, wenn das der Fall ist.
Ich hoffe, Ihr C++ tPacket ist ein POD (keine virtuellen Methoden) und enthält keine Zeiger oder Refrences. Und ich hoffe, dass Ihr C# tPacket ein Werttyp ist, der nur aus Werttypen besteht (die nur aus Werttypen bestehen, ... also gibt es in Ihrem Objektdiagramm keinen Referenztyp). – mmmmmmmm