Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ein DWORD mit einem Array of Char füllen? (https://www.delphipraxis.net/8344-ein-dword-mit-einem-array-char-fuellen.html)

phlux 2. Sep 2003 19:43


Ein DWORD mit einem Array of Char füllen?
 
Hi!
Tut mir leid das dies jetzt recht trivial klingen mag in mancher Leuten Ohren :oops: aber da ich mich damit noch nie wirklich beschäftigt habe (ich habe es immer als gegeben hingenomme :? ) stellt sich mir folgendes Problem recht knifflig dar:

Delphi-Quellcode:
var
  UserName: Array[0..3] of Char;
  ID: DWORD;

begin
  UserName := 'abcd';
  //??
end;
Also wie man hier sieht habe ich einen 4 Teiligen Array vom Typen Char, den habe ich mit 'abcd' gefüllt. Jetzt mein Problem ich habe gelesen das man jetzt diesen Array in ein DWORD (was genau 4 Bytes groß sein soll laut der OH von Delphi ;) ) schreiben kann. Allerdings weiß ich nicht wie, hab zwar schon durch wild googeln und OH von Delphi herausgefunden dass es die Funktion FillChar gibt, aber diese erfüllt nicht meinen Zweck den ich verfolg, so denke ich.
Hoffe ihr könnt mir weiterhelfen.

mfg phluphie :hi:

Leuselator 2. Sep 2003 19:52

Re: Ein DWORD mit einem Array of Char füllen?
 
Delphi-Quellcode:
type
  MeinDWordPointer = ^DWord;

var
  MeinArray : Array [0..3] of Byte/Char
  MeinDWord : DWord;


nun kannst Du :

  MeinDWordPointer := @MeinDWord;
  MeinDWordPointer[0] := MeinArray[0];
etc.

[edit=Daniel B]Delphi-Tags eingefügt. Mfg, Daniel B[/edit]

Chewie 2. Sep 2003 19:52

Re: Ein DWORD mit einem Array of Char füllen?
 
Ein Array[0..3] of Char ist 4 Byte groß, ein DWord auch. Somit passt das Array rein.

Ein einfacher Cast tuts:
Delphi-Quellcode:
var
  UserName: Array[0..3] of Char;
  ID: DWORD;
begin
  UserName := #255#0#0#0;
  ID := DWord(UserName);
  ShowMessage(InttoStr(ID));
Das Ergebnis (man glaubt es kaum): 255.

phlux 2. Sep 2003 19:55

Re: Ein DWORD mit einem Array of Char füllen?
 
:hello: Danke euch beiden für die schnelle Hilfe. Es klappt wunderbar :mrgreen:

Assarbad 2. Sep 2003 20:10

Re: Ein DWORD mit einem Array of Char füllen?
 
@Chewie, dann erklär uns doch bitte nochmal, wieso du #255#0#0#0 schreibst, aber nicht die Zahl $FF000000 rauskommt ;)

Außerdem gibt es zwei elegantere Methoden obiges zu erreichen:
Delphi-Quellcode:
type
  TMyDWORD=record
  case Integer of
  0: (AsDWORD:DWORD);
  1: (AsArray:array[0..3] of Char);
  end;
var
  MyDWORD:TMyDWORD;
  MyArray:Array[0..3] of Char;
  MyDWORD2:DWORD absolute MyArray;
begin
  MyDWORD.AsDWORD :=$FF;
  MyDWORD.AsArray :=#0#0#0#$FF;
end.
MyDWORD2 und MyArray zeigen einfach auf die selbe Speicherstelle ... und bei TMyDWORD ist es nicht anders, da wir eine Union deklarieren ...

Abhängig vom Kontext würde ich die eine oder die andere Variante benutzen.

Chewie 2. Sep 2003 20:14

Re: Ein DWORD mit einem Array of Char füllen?
 
Zitat:

Zitat von Assarbad
@Chewie, dann erklär uns doch bitte nochmal, wieso du #255#0#0#0 schreibst, aber nicht die Zahl $FF000000 rauskommt ;)

Das Byte, das im Array dem Index 3 entspricht, ist das "hochwertigste", nicht das, das dem Index 0 entspricht. Wollte ich $FF000000, müsste ich #0#0#0#255 schreiben.

Christian Seehase 2. Sep 2003 20:18

Re: Ein DWORD mit einem Array of Char füllen?
 
Moin Chewie,

es liegt daran, dass ein Wert vom Typ DWORD im Intel-Format ausgelesen (und natürlich geschrieben) wird, und hierbei gilt, dass im Speicher an der niedrigsten Adresse das niederwertigste Byte steht (gilt natürlich auch analog für WORD, bzw. QUADWORD)

Chewie 2. Sep 2003 20:20

Re: Ein DWORD mit einem Array of Char füllen?
 
Genau. Bei den Bytes ist das niederwertigste am Anfang.
Und wie wars nochmal bei den Bits? Verdammt, ich kann mir das nie merken. :roll:

Christian Seehase 2. Sep 2003 20:22

Re: Ein DWORD mit einem Array of Char füllen?
 
Moin Chewie,

gilt nur für die Bytes, nicht für die Bits.

Snoop007 2. Sep 2003 20:23

Re: Ein DWORD mit einem Array of Char füllen?
 
1. das wusste ich nicht das soetwas geht, logisch ist es aber
2. wozu kann man das brauchen ?

Assarbad 2. Sep 2003 21:05

Re: Ein DWORD mit einem Array of Char füllen?
 
Wenn du undokumentierte Strukturen untersuchst ist das schon wichtig.

Stichwort BIG-ENDIAN und LITTLE-ENDIAN ;)

Nun, wozu man Unions und das "absolute" Statement gebrauchen kann, ist ja gut sichtbar. Weiteres ist denkbar ... aber sobald du es erstmal angewandt hast, werden sich dir diese anderen Einsatzmöglichkeiten schon erschließen, glaube mir ;)

Snoop007 2. Sep 2003 21:57

Re: Ein DWORD mit einem Array of Char füllen?
 
Assarbad, hast du paar links oder ähnliches
ich hab davon noch nie gehört ich kann mir auch nichts darunter vorstellen

Assarbad 2. Sep 2003 22:24

Re: Ein DWORD mit einem Array of Char füllen?
 
Hier ein Link:

http://www3.informatik.tu-muenchen.d...big_endian.pdf

Snoop007 2. Sep 2003 22:37

Re: Ein DWORD mit einem Array of Char füllen?
 
danke !

negaH 3. Sep 2003 00:19

Re: Ein DWORD mit einem Array of Char füllen?
 
Tja bei all den korrekten Lösungen will ich hier noch eine draufsetzen.

Delphi-Quellcode:

function Swap(Value: DWord): DWord;
asm
   BSWAP EAX
end;

var
  UserName: array[0..3] of Char;
  ID: DWord; absolute UserName;
begin
  UserName := '1234';
  ShowMessage( IntToHEX(Swap(ID), 8) );
end;
Gruß Hagen

negaH 3. Sep 2003 00:22

Re: Ein DWORD mit einem Array of Char füllen?
 
Shit, Asserbad hat's ja schon gepostet, sehe ich erst jetzt. (Hey Brille wo steckst du schon wieder ! mach dich her ich sehe nichts :))

Gruß Hagen

Assarbad 3. Sep 2003 09:29

Re: Ein DWORD mit einem Array of Char füllen?
 
Fehlt nur noch eine Erklärung ;) (warum du swappst) ;)

Weil Snoop nach einem Beispiel gefragt hat:

Ein ganz praktisches Beispiel sind die Signaturen im EXE-Header und im PE-Header. In Delphi findet man die meist als Konstanten wieder. Und da zB im PE-Header der "String" so aussieht 'PE'#0#0 also die Buchstaben P und E gefolgt von zweimal dem Zeichen 0, ist esmöglich dies als Hexadezimalwert zu schreiben. Nur da sieht es komplett anders aus:
IMAGE_NT_SIGNATURE = $00004550; // PE00

#0#0 kommen zuerst ;) ... und dann folgen E und P ... auf der Festplatte ist es beispielsweise genau andersherum abgespeichert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:39 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