![]() |
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:
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.
var
UserName: Array[0..3] of Char; ID: DWORD; begin UserName := 'abcd'; //?? end; Hoffe ihr könnt mir weiterhelfen. mfg phluphie :hi: |
Re: Ein DWORD mit einem Array of Char füllen?
Delphi-Quellcode:
etc.
type
MeinDWordPointer = ^DWord; var MeinArray : Array [0..3] of Byte/Char MeinDWord : DWord; nun kannst Du : MeinDWordPointer := @MeinDWord; MeinDWordPointer[0] := MeinArray[0]; [edit=Daniel B]Delphi-Tags eingefügt. Mfg, Daniel B[/edit] |
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:
Das Ergebnis (man glaubt es kaum): 255.
var
UserName: Array[0..3] of Char; ID: DWORD; begin UserName := #255#0#0#0; ID := DWord(UserName); ShowMessage(InttoStr(ID)); |
Re: Ein DWORD mit einem Array of Char füllen?
:hello: Danke euch beiden für die schnelle Hilfe. Es klappt wunderbar :mrgreen:
|
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:
MyDWORD2 und MyArray zeigen einfach auf die selbe Speicherstelle ... und bei TMyDWORD ist es nicht anders, da wir eine Union deklarieren ...
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. Abhängig vom Kontext würde ich die eine oder die andere Variante benutzen. |
Re: Ein DWORD mit einem Array of Char füllen?
Zitat:
|
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) |
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: |
Re: Ein DWORD mit einem Array of Char füllen?
Moin Chewie,
gilt nur für die Bytes, nicht für die Bits. |
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 ? |
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 ;) |
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 |
Re: Ein DWORD mit einem Array of Char füllen?
|
Re: Ein DWORD mit einem Array of Char füllen?
danke !
|
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:
Gruß Hagenfunction 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; |
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 |
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