AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Typecasting

Ein Thema von calibra301 · begonnen am 24. Jul 2018 · letzter Beitrag vom 25. Jul 2018
Antwort Antwort
calibra301

Registriert seit: 20. Mär 2009
95 Beiträge
 
Delphi XE8 Professional
 
#1

Typecasting

  Alt 24. Jul 2018, 10:46
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
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Typecasting

  Alt 24. Jul 2018, 10:49
Hallo,

Delphi-Quellcode:
type
  T16ByteArray=Array[0..15] of byte;
var
  Daten: T16ByteArray;
Und dann auf T16ByteArray casten.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#3

AW: Typecasting

  Alt 24. Jul 2018, 11:22
Zitat:
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)
Tudasbitte(Pointer(@Daten), 16);

Zitat:
und an einer anderen mit einem Array of Longword.
Array of LongWord oder 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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (24. Jul 2018 um 11:27 Uhr)
  Mit Zitat antworten Zitat
calibra301

Registriert seit: 20. Mär 2009
95 Beiträge
 
Delphi XE8 Professional
 
#4

AW: Typecasting

  Alt 25. Jul 2018, 06:48
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
Angehängte Dateien
Dateityp: zip XTEA Crypt.zip (4,49 MB, 1x aufgerufen)
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
563 Beiträge
 
Delphi XE6 Enterprise
 
#5

AW: Typecasting

  Alt 25. Jul 2018, 08:20
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...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#6

AW: Typecasting

  Alt 25. Jul 2018, 10:17
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 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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (25. Jul 2018 um 10:20 Uhr)
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
563 Beiträge
 
Delphi XE6 Enterprise
 
#7

AW: Typecasting

  Alt 25. Jul 2018, 10:31
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...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#8

AW: Typecasting

  Alt 25. Jul 2018, 10:49
MAXIMAL!!!

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

Nur bei {$A-} und {$ALIGN 1} oder packed array und 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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:40 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