Autor |
Beitrag |
ika89
Hält's aus hier
Beiträge: 15
|
Verfasst: So 02.08.09 18:27
hallo leute,
kann mir jemand eine elegantere lösung verraten einzelne Bytes in einem DWORD zu setzen?
meine bisherige ist:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure test(); var b:Byte; d:DWORD; begin d:=0; b:=30;
d:=b;
d:=b*256;
end; |
meine frage ist nun ob es irgendwie in der art geht:
Delphi-Quelltext
ich hoffe das es jemanden gibt der versteht was ich meine 
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 02.08.09 18:29
Delphi-Quelltext 1: 2: 3: 4: 5:
| type TDWORDtoByte = packed record case Boolean of false: (d: DWORD; ); true: (b: array[0..3] of Byte; ); end; |
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
ika89 
Hält's aus hier
Beiträge: 15
|
Verfasst: So 02.08.09 18:53
BenBE hat folgendes geschrieben : | Delphi-Quelltext 1: 2: 3: 4: 5:
| type TDWORDtoByte = packed record case Boolean of false: (d: DWORD; ); true: (b: array[0..3] of Byte; ); end; | |
Danke für die schnelle Antwort, habs ausprobiert und... es gefällt mir ^^ wieder was dazugelernt
Noch zwei Fragen:
1. Wie bewirkt dieses "case Boolean of" (bzw. wie kommt das zustande), dass die variablen "d" und "b" auf den selben speicher zeigen?
2. Gibt es die Möglichkeit den selben Sachverhalt in folgender Form zu lösen:
für das 1. Byte - die adresse von der DWORD variablen ermitteln und den Byte bei dieser adressse auf einen Wert setzen
für das 2. Byte - die adresse von der DWORD variablen + 1 und das dann auf einen bestimmten wert setzen
für das 3. Byte - die adresse von der DWORD variablen + 2 und das dann auf einen bestimmten wert setzen usw. ?
[edit]
um mich verständlicher zu machen habe ich ein kurzes Beispiel gemacht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| var dw: DWORD; bl:array[0..3]of Byte; begin b1[0]:=dw shr 0; b1[1]:=dw shr 8; b1[2]:=dw shr 16; b1[3]:=dw shr 24;
(dw shr 8):=b1[1]; |
was muss umgestaltet werden?
Zuletzt bearbeitet von ika89 am So 02.08.09 19:11, insgesamt 1-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 02.08.09 19:07
ika89 hat folgendes geschrieben : | Gibt es die Möglichkeit den selben Sachverhalt in folgender Form zu lösen: |
Genau das macht der variante Record ja. Eben weil beides auf den selben Speicher zugreift.
Und so wie du es meinst:
Adresse mit @ ermitteln, auf integer casten, um 0, 1, ... erhöhen und auf PByte casten.
Dann mit xy^ := 4 den Wert schreiben.
|
|
ika89 
Hält's aus hier
Beiträge: 15
|
Verfasst: So 02.08.09 19:16
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 02.08.09 19:24
|
|
ika89 
Hält's aus hier
Beiträge: 15
|
Verfasst: So 02.08.09 19:34
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 02.08.09 19:40
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure EditDWORDBytewise(d:DWORD); var b: packed array[0..3] of Byte absolute d; begin b[2] := 3; end; |
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 02.08.09 20:05
Oder: Delphi-Quelltext 1: 2: 3: 4:
| procedure EditDWORDBytewise(var d: DWORD); begin LongRec(d).Bytes[1] := 4; end; |
|
|
|