Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zugriff auf einzelne Bytes eines DWORD / Cardinal (https://www.delphipraxis.net/91739-zugriff-auf-einzelne-bytes-eines-dword-cardinal.html)

DelphiManiac 9. Mai 2007 10:03


Zugriff auf einzelne Bytes eines DWORD / Cardinal
 
Hallo,

ich habe zurzeit folgendes Problem:

ich bekomme eine DWORD bzw Cardinal übergeben und muss auf die einzelnen Bytes zugreifen können.

Beispiel

11111111 11111111 1111111 11111111
--------------------------'-----------------------------
Word H __________________Word L


Also ich will dann auf das 1. und 2. Byte von Word H und Word L
zugreifen können


Vielleicht könnt ihr mir da ja helfen

Wenn ich es in 2 Word aufteilt habe, dann kann ich ja über
Delphi-Quellcode:
Hi
Lo
auf die High und Low Bytes zugreifen.

Aber wie teile ich das DWORD in 2 Words,

indem ich die Bits schiebe (shl / shr)???
:gruebel:
Danke Euch

teebee 9. Mai 2007 10:23

Re: Zugriff auf einzelne Bytes eines DWORD / Cardinal
 
Zitat:

Zitat von DelphiManiac
Aber wie teile ich das DWORD in 2 Words

Mit LoWord und HiWord,

Gruß, teebee

divBy0 9. Mai 2007 10:25

Re: Zugriff auf einzelne Bytes eines DWORD / Cardinal
 
Ich bin mir zwar nicht sicher ob das funktioniert, aber du kannst versuchen das DWORD durch schieben aufzuteilen.

Eigentlich müsstest du durch 4x schieben jedes Byte in eine eigene Variable schreiben können, dann kannst du damit ja weiterarbeiten.

LoWord und HiWord hab ich in der Hilfe nicht gefunden...

teebee 9. Mai 2007 10:29

Re: Zugriff auf einzelne Bytes eines DWORD / Cardinal
 
Zitat:

Zitat von divBy0
LoWord und HiWord hab ich der Hilfe nicht gefunden...

Das sind Makros aus dem Windows-API (windef.h), die in windows.pas zu finden sind.
LoWord ist einfach ein Cast nach Word, HiWord eine Funktion, die mit dem DWORD ein shr 16 macht.

divBy0 9. Mai 2007 10:36

Re: Zugriff auf einzelne Bytes eines DWORD / Cardinal
 
Danke!

Wieder was gelernt! Wobei die Funktion auch ein fach nur um 16 nach rechts bzw. links schiebt...

DelphiManiac 9. Mai 2007 10:37

Re: Zugriff auf einzelne Bytes eines DWORD / Cardinal
 
Hallo,

HiWord und LoWord sind genau die Funktionen (die ein Makro kapseln wie Teebee richtig beschreibt) die ich gesucht habe,

nun kann ich dann mit

Delphi-Quellcode:
 HiByte(HiWord(einDword))
 LoByte(HiWord(einDword))
und

Delphi-Quellcode:
 HiByte(LoWord(einDword))
 LoByte(LoWord(einDword))
darauf zugreifen...

Danke euch!!

SebE 9. Mai 2007 10:44

Re: Zugriff auf einzelne Bytes eines DWORD / Cardinal
 
Delphi-Quellcode:
type
  WordTeiler = record
    case BYTE of
    0: (dw: DWORD);
    1: (wa: array[0..1] of WORD);
  end;

var
  i: DWORD;
  w: WORD;

...

w := WordTeiler(i).wa[0];
Man muss nur auf die Rechner-Architektur achten!

Hawkeye219 9. Mai 2007 10:44

Re: Zugriff auf einzelne Bytes eines DWORD / Cardinal
 
Hallo,

du kannst auch den Typ LongRec aus der Unit SysUtils verwenden:

Delphi-Quellcode:
var
  Value : Cardinal;
begin
  Value := $12345678;
  with LongRec(Value) do
    ShowMessage (Format('%.2x %.2x %.2x %.2x', [Bytes[0], Bytes[1], Bytes[2], Bytes[3]]));
end;
Gruß Hawkeye

Nachtreiter 9. Mai 2007 12:55

Re: Zugriff auf einzelne Bytes eines DWORD / Cardinal
 
Hi,
unbedingt die Reihenfolge in einem Word beachten, schreibe 256 rein und Bytes Anzeigen.
Wo steht die 1?
:wall:

SirThornberry 9. Mai 2007 13:59

Re: Zugriff auf einzelne Bytes eines DWORD / Cardinal
 
eine weitere Möglichkeit ist die Adresse der Variablen zu nehmen und diese ein paar Bytes weiter zu rücken.


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