![]() |
Definitions union von C nach Delphi
Hi Leute,
da ich mit der Sache rein gar nichts anfangen kann, heute mal so rum gerag. Ich habe mal wieder einen C++ Header den ich nach Delphi bringen muss. Da habe ich folgenden Konstrukt den ich nicht kenne:
Code:
Im Besoderen geht es mit hier um die Definition des union-Bereiches. Mit den Strukturen komme ich klar. Kann mir jemand sagen, wie ich das nach Delphi 2007 bringe un was da definiert wird?
typedef union
{ uint_32t l; uint_8t b[4]; } aes_inf; typedef struct { uint_32t ks[KS_LENGTH]; aes_inf inf; } aes_encrypt_ctx; typedef struct { uint_32t ks[KS_LENGTH]; aes_inf inf; } aes_decrypt_ctx; Gruß oki |
Re: Definitions union von C nach Delphi
Unions sind Objekte, die sich an der selben Speicheradresse befinden (sowas wie ein typisierter Alias).
In Delphi lässt sich das über "variante Records" abbilden:
Delphi-Quellcode:
Hinweis: einfach runtergetippt, kein Anspruch auf Kompilierbarkeit :)
type
PAesInf = ^TAesInf; TAesInf = record case Integer of 4: (l: LongWord); 1: (b: array [0..3] of Byte); { end; } end; type PAesEncryptCtx = ^TAesEncryptCtx; TAesEncryptCtx = record ks: array [0..KS_LENGTH-1] of LongWord; inf: TAesInf; end; type PAesDecryptCtx = ^TAesDecryptCtx; TAesDecryptCtx = record ks: array [0..KS_LENGTH-1] of LongWord; inf: TAesInf; end; |
Re: Definitions union von C nach Delphi
Zitat:
Union ist doch nur, dass diese Struktur unterschiedliche Werte annehmen kann( IMHO ). Also nimm doch einfach Record und z.B. dann die ^Recordbezeichnung aes_inf als Variable. |
Re: Definitions union von C nach Delphi
Ähhhm,
sorry, das bring ich jetzt nicht zusammen. Zitat:
2. Was verstehst du unter Variante Records? Soll das bedeuten, dass der Wert in inf sowohl vom Typ Longword als auch Array of Byte sein kann? @Der.Kaktus: Das hab ich nicht verstanden: Zitat:
|
Re: Definitions union von C nach Delphi
Zitat:
Zitat:
TAesInf ist so groß wie seine größte "Interpretationsmöglichkeit" (4 Bytes in beiden Fällen). (edit: wenn man den Wert von "l" ändert, ändert man auch den Inhalt von "b" - und vis versa) In der Delphi-Hilfe gibt es sicherlich einen Abschnitt zu "varianten (Teilen von) Records". |
Re: Definitions union von C nach Delphi
Hi nicodex,
ich habs gerafft. Dank für die Hilfe. Gruß oki |
Re: Definitions union von C nach Delphi
Zitat:
![]()
Delphi-Quellcode:
P.S.: Bin zwar keine "C-Wolke" aber glaube so ging die Umwandlung. :wink:
Type union = Record
l:integer; b:Array[0..3] of smallint; end; var aes_inf: ^union; |
Re: Definitions union von C nach Delphi
Zitat:
Zudem hat Delphis SmallInt 16-Bit inklusive Vorzeichen (es sollten 8 ohne Vorzeichen sein: Byte). Um es zu verdeutlichen: Die C-Deklaration ist 4 Bytes groß, deine allerdings 12 Bytes. |
Re: Definitions union von C nach Delphi
Zitat:
Code:
Somit interpretiere ich dies auch als einen vorzeichenlosen 8-Bit Wert. Das sollte dann imho auch der Typ Byte sein.
uint_8t b[4];
Trotzdem auch an dich herzlichen Dank Der.Kaktus. Mit eurer Hilfe konnte ich doch schnell Licht ins Dunkel bringen. Gruß oki |
Re: Definitions union von C nach Delphi
Jetzt doch noch eine Frage hinterher.
Durch den Case auf Integer ist ja festgelegt, dass die einzelnen Elemente des Records zwar unterschiedlichen Typs sein dürfen, aber im Speicher alle die gleiche Länge (Integer = 32 Bit) haben müssen. So hab ich es jedenfalls verstanden. in der angegebenen Erläuterung zu union von nicodex (Link) ist aber folgendes Beispiel angegeben:
Code:
hier sind doch definitiv unterschiedliche Längen definiert. Ein
typedef union {
float einfach; double mittel; long double hoch; } Reell;
Delphi-Quellcode:
ist doch sicher nicht zulässig. Oder doch?
TReell = record
case Double of einfach : Float; mittel : Double; hoch : Int64; end; Gruß oki |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz