Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Cardinal in Bytes speichern (https://www.delphipraxis.net/123099-cardinal-bytes-speichern.html)

Neutral General 27. Okt 2008 22:28

Re: Cardinal in Bytes speichern
 
Zitat:

Zitat von xZise
Wie stellst du dir das vor?

Naja so:


Delphi-Quellcode:
type
  TFoo = packed record
    case Integer of
      0: (arr: array[0..5] of Byte);
      1: (
           dummy1: Word;
           Wert: Cardinal;
         );
  end;

var foo: TFoo;
    i: Integer;
begin
  // foo füllen
  for i:= 0 to 5 do
    foo.arr[i] := random(256); // ka.. deine daten halt
  // Du willst jetzt nur den Errorcode?
  // ==>
  // Der steht in foot.Wert:
  Send(foo.Wert);
end;
Oder eben umgekehrt. In den Cardinal schreiben und die Bytes auslesen. Die 6 Bytes und der 1. Word + der Cardinal belegen den gleichen Speicher:

Code:
-----------------------------------------------------
| Byte1 | Byte2 | Byte3 | Byte4 | | Byte5 | | Byte6 |
------------------------------------------------------
|    dummy1     |       W     e     r     t     |
------------------------------------------------------

x000x 27. Okt 2008 23:40

Re: Cardinal in Bytes speichern
 
Moin moin,

eine weitere Möglichkeit wäre noch der Weg über Pointer:
Delphi-Quellcode:
//...
var
   Arr : Array[0..5] of Byte;
   P   : PCardinal;
   Wert : Cardinal;
begin
   Wert := 4294967295;
   //Cardinal in Array scheiben
   P := @Arr[2];
   P^:= Wert;
   // und wieder auslesen
   // Little Endian
   //WertNeu := (Arr[5] shl 24) or (Arr[4] shl 16) or (Arr[3] shl 8) or Arr[2];
   xxx := PCardinal(@Arr[2])^;
//...

//...
   // bzw gleich so
   PCardinal(@Arr[2])^ := 4294967295;
   // und auslesen halt wieder
   xxx := PCardinal(@Arr[2])^;

xZise 28. Okt 2008 17:04

Re: Cardinal in Bytes speichern
 
Zitat:

Zitat von x000x
Moin moin,

eine weitere Möglichkeit wäre noch der Weg über Pointer:
Delphi-Quellcode:
//...
var
   Arr : Array[0..5] of Byte;
   P   : PCardinal;
   Wert : Cardinal;
begin
   Wert := 4294967295;
   //Cardinal in Array scheiben
   P := @Arr[2];
   P^:= Wert;
   // und wieder auslesen
   // Little Endian
   //WertNeu := (Arr[5] shl 24) or (Arr[4] shl 16) or (Arr[3] shl 8) or Arr[2];
   xxx := PCardinal(@Arr[2])^;
//...

//...
   // bzw gleich so
   PCardinal(@Arr[2])^ := 4294967295;
   // und auslesen halt wieder
   xxx := PCardinal(@Arr[2])^;

An sowas dachte ich halt ;) Ich schreibe mal eine Demoapplikation.

MfG
xZise

Cyf 28. Okt 2008 17:10

Re: Cardinal in Bytes speichern
 
Zitat:

Zitat von Hawkeye219
Hallo,

ohne das Schlüsselwort "packed" könnte die Lösung mit dem varianten Record aber ins Auge gehen...

Gruß Hawkeye

Wird das eigentlich von Delphi noch unterstüzt? Hab da was im Kopf, aber kann möglicherweise zu einem ganz anderen Thema gewesen sein. :oops:

x000x 28. Okt 2008 17:16

Re: Cardinal in Bytes speichern
 
Moin moin,

wie gesagt, dass war nur eine weitere Möglichkeit. Ich persönlich würde die Variante von jfheins
auch bevorzugen.

Cyf 28. Okt 2008 17:31

Re: Cardinal in Bytes speichern
 
Habs grad mal getestet, scheint noch zu funktionieren, entschuldigt die unnötige Verwirrung :stupid:
Delphi-Quellcode:
  TA = record
    AByte: Byte;
    BInt: Integer;
  end;
  TB = packed record
    AByte: Byte;
    BInt: Integer;
  end;
TA: 8 Bytes
TB: 5 Bytes


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:41 Uhr.
Seite 2 von 2     12   

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