![]() |
Typecasting
Hallo,
verzweifele hier an einer C++ -> Delphi Übersetzung. Dort gibt's eine Funktion der Daten per Pointer auf ein Array of Longword(U32) übergeben werden. Die Funktion wird an einer Stelle mit einem Array of Byte aufgerufen und an einer anderen mit einem Array of Longword. Hab also:
Delphi-Quellcode:
wobei mir hier nun der Typecast fehlt und ich keine Ahnung hab wie der aussehen muss.Daten:Array[0..15] of byte; result:=Tudasbitte(@Daten,16); Hinten müssen 2 x 8 Byte statt 1x 16 Byte ankommen. Danke und Gruss Calli |
AW: Typecasting
Hallo,
Delphi-Quellcode:
Und dann auf T16ByteArray casten.
type
T16ByteArray=Array[0..15] of byte; var Daten: T16ByteArray; |
AW: Typecasting
Zitat:
Aber falls der Funktionsparameter typ-behaftet ist, dann einfach typlos zuweisen. (natürlich nur, wenn niemand an ![]()
Delphi-Quellcode:
Tudasbitte(Pointer(@Daten), 16);
Zitat:
Delphi-Quellcode:
oder
Array of LongWord
Delphi-Quellcode:
?
Array[0..3] of LongWord
Ein statisches Array kann nicht in ein dynamisches Array gecastet werden. Du kannst den Cast auch direkt einbauen.
Delphi-Quellcode:
MyData.L oder MyData.B
type
TMyData = record case Integer of 0: (B: array[0..15] of Byte); 1: (L: array[0..3] of LongWord); end; |
AW: Typecasting
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
danke fürs Feedback..übersteigt leider alles etwas meinen Horizont... :-( Die Daten kommen aber nun sauber in der Funktion an. Hintergrund vom ganzen ist eine XTEA Verschlüsselung. Der Andere Programmierer benutzt C++ Er hat mir ein Beispiel mit Vorgegebenen Keys und Daten durchgerechnet und mir die Werte gemailt. Key0=$11111111 Key1=$22222222 Key2=$33333333 Key3=$44444444 Data[0] und Data[1] =0 Sein Ergebnis Decrypt: Data[0] 0xf07ac290 Data[1] 0x23c92672 Encrypt: Data[0] 0x889766b6 Data[1] 0x0a0c49d9 Anbei mal ein zip in dem das Projekt und eine Textdateil mit dem C Code ist. Ist ein XE8 Projekt. Vielleicht findet jemand meinen Bock. Gruss Calli |
AW: Typecasting
Zitat:
|
AW: Typecasting
Nein, da kommt immer das raus, was ich erwarte, denn Arrays sind "praktisch" IMMER packed.
Außerdem gibt {$A} nur die maximale Ausrichtung an, wobei die Typen der Array-Felder hier ALLE gleich sind, innerhalb des Array, und sich die Array-Felder somit immer an sich selber ausrichten, also direkt hintereinander. Das trifft auch auf ein
Delphi-Quellcode:
zu, welches in sich pecked und direkt aneinanderhängend ausgerichtet ist, auch wenn dort "natürlich" das zusätzliche Füllbyte enthalten bleibt, da es im "kompleten" Typen eingebaut ist.
Array of TMist
Delphi-Quellcode:
TMist ist 4 Byte und wird somit auch an Integergrenzen ausgerichtet.
// {$ALIGN} mindestens 2
type TMist = record a: Word; b: Byte; // FüllByte end; TMist = record a: Byte; // FüllByte b: Word; end; |
AW: Typecasting
Zitat:
|
AW: Typecasting
MAXIMAL!!!
Bytes werden IMMER an Bytegrenzen ausgerichtet und Word werden immer an Wordgrenzen ausgerichtet (wenn ALIGN mindestens 2, also
Delphi-Quellcode:
und
{$A+}
Delphi-Quellcode:
bis
{$ALIGN 2}
Delphi-Quellcode:
)
{$ALIGN 16}
Nur bei
Delphi-Quellcode:
und
{$A-}
Delphi-Quellcode:
oder
{$ALIGN 1}
Delphi-Quellcode:
und
packed array
Delphi-Quellcode:
wird WORD an 1-Bytegrenzen ausgerichtet, aber niemals wird es mehr sein, also niemals tauchen Füllbytes auf, zwischen WORD und WORD.
packed record
$MINIMUMENUMSIZE füllt auf, aber $ALIGN kürzt immer nur |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 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 by Thomas Breitkreuz