Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Typecasting (https://www.delphipraxis.net/197242-typecasting.html)

calibra301 24. Jul 2018 10:46

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:

Daten:Array[0..15] of byte;

result:=Tudasbitte(@Daten,16);
wobei mir hier nun der Typecast fehlt und ich keine Ahnung hab wie der aussehen muss.

Hinten müssen 2 x 8 Byte statt 1x 16 Byte ankommen.


Danke und Gruss
Calli

hoika 24. Jul 2018 10:49

AW: Typecasting
 
Hallo,

Delphi-Quellcode:
type
  T16ByteArray=Array[0..15] of byte;
var
  Daten: T16ByteArray;
Und dann auf T16ByteArray casten.

himitsu 24. Jul 2018 11:22

AW: Typecasting
 
Zitat:

Delphi-Quellcode:
Tudasbitte(@Daten, 16);

Wenn die Daten als typloser Pointer übergeben werden, dann ist das Format deiner Variable doch vollkommen egal und du musst nichts casten.

Aber falls der Funktionsparameter typ-behaftet ist, dann einfach typlos zuweisen. (natürlich nur, wenn niemand an http://docwiki.embarcadero.com/RADSt...igern_(Delphi) rumgespielt hat)
Delphi-Quellcode:
Tudasbitte(Pointer(@Daten), 16);


Zitat:

und an einer anderen mit einem Array of Longword.
Delphi-Quellcode:
Array of LongWord
oder
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:
type
  TMyData = record
  case Integer of
    0: (B: array[0..15] of Byte);
    1: (L: array[0..3] of LongWord);
  end;
MyData.L oder MyData.B

calibra301 25. Jul 2018 06:48

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

Frickler 25. Jul 2018 08:20

AW: Typecasting
 
Zitat:

Zitat von himitsu (Beitrag 1408497)
Du kannst den Cast auch direkt einbauen.
Delphi-Quellcode:
type
  TMyData = record
  case Integer of
    0: (B: array[0..15] of Byte);
    1: (L: array[0..3] of LongWord);
  end;
MyData.L oder MyData.B

Wenn Du nicht mit $A rumhantieren willst, musst Du "packed array" nehmen, sonst kommt da was ganz anderes bei raus...

himitsu 25. Jul 2018 10:17

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:
Array of TMist
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.
Delphi-Quellcode:
// {$ALIGN} mindestens 2 
type
  TMist = record
    a: Word;
    b: Byte;
    // FüllByte
  end;

  TMist = record
    a: Byte;
    // FüllByte
    b: Word;
  end;
TMist ist 4 Byte und wird somit auch an Integergrenzen ausgerichtet.

Frickler 25. Jul 2018 10:31

AW: Typecasting
 
Zitat:

Zitat von himitsu (Beitrag 1408627)
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.

TMist ist 4 Byte und wird somit auch an Integergrenzen ausgerichtet.

Wenn ein Array of Byte ins Spiel kommt, sind Integergrenzen aber eher nicht gewünscht. Darüber bin ich nämlich gefallen bei der Umstellung unserer Programme von Delphi 5 auf XE. Bei D5 war alles bytealigned und bei XE nicht...

himitsu 25. Jul 2018 10:49

AW: Typecasting
 
MAXIMAL!!!

Bytes werden IMMER an Bytegrenzen ausgerichtet
und Word werden immer an Wordgrenzen ausgerichtet (wenn ALIGN mindestens 2, also
Delphi-Quellcode:
{$A+}
und
Delphi-Quellcode:
{$ALIGN 2}
bis
Delphi-Quellcode:
{$ALIGN 16}
)

Nur bei
Delphi-Quellcode:
{$A-}
und
Delphi-Quellcode:
{$ALIGN 1}
oder
Delphi-Quellcode:
packed array
und
Delphi-Quellcode:
packed record
wird WORD an 1-Bytegrenzen ausgerichtet, aber niemals wird es mehr sein, also niemals tauchen Füllbytes auf, zwischen WORD und WORD.


$MINIMUMENUMSIZE füllt auf,
aber $ALIGN kürzt immer nur


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz