![]() |
Cardinal in Bytes speichern
Hallo ihr,
ich habe folgendes "Problem". Und zwar läuft eine Verbindung zwischen zwei Punkten mithilfe von Bytearrays ab. Bisher hat das gereicht, aber jetzt will ich den ErrCode übertragen. Aber wie macht man das? Der ist ja 4 Byte lang. Und ich hätte dann 6 Bytes zur Verfügung wo der Cardinal in den letzt 4 gespeichert wird. MfG xZise |
Re: Cardinal in Bytes speichern
Schlecht zu beantworten, wie ist denn der ErrorCode definiert bzw. wie gross kann der enthaltene Wert werden ?
Cardinal = 8 Byte bzw. 32 Bit das heisst du breutest 2 mal 6 Bytes zur die du zur Verfügung hast um ein 8 Byte-Wert zu übertragen. |
Re: Cardinal in Bytes speichern
Also ich habe mit der Codevervollständigung geguckt und diese gibt mir halt Cardinal an. Bzw. im Code ist es als DWord definiert was ja ein Cardinal auch ist.
MfG xZise |
Re: Cardinal in Bytes speichern
Genau. DWord (32bit = 4 Bytes) und nicht 8 Bytes :mrgreen:
Schau dir mal variante records an, damit kannst du den Cardinal als Bytearray ansprechen und umgekehrt - falls es das ist, was du willst :gruebel: |
Re: Cardinal in Bytes speichern
Zitat:
|
Re: Cardinal in Bytes speichern
Naja meine Frage ist einfach wie kriege ich die da am einfachsten rein.
Einfach das?
Delphi-Quellcode:
Ich dachte das man einfach die Bits über das Array schiebt:
for i := 0 to 3 do
b[i + 2] := ErrCode div Power(255, i);
Code:
Sozusagen setzte die 32 bits des Cardinals in die Byteschlange des Arrays ab dem 16. / 17. Bit.
Array: 01010101 01010101 10011001 01100110 10100101 11000110
-------- Head ---------- ---------------Data---------------- ^ ^ ^ ^ Cardinal: 10011001 01100110 10100101 11000110 MfG xZise |
Re: Cardinal in Bytes speichern
Ich finde das heir wesenlich einfacher:
Delphi-Quellcode:
Dann einfach in Wert deinen Cardinalwert reinschrieben, und du kannst ihn in arr als Bytearray wieder rausholen ;)
type
Foo = record case Integer of 0: (arr: array[0..5] of Byte); 1: ( dummy1: Word; Wert: Cardinal; ); end; |
Re: Cardinal in Bytes speichern
Ungetestet:
Delphi-Quellcode:
Uli.
for i := 0 to 3 do
b[i + 2] := LongRec(ErrCode).Bytes[i]; |
Re: Cardinal in Bytes speichern
Hallo,
ohne das Schlüsselwort "packed" könnte die Lösung mit dem varianten Record aber ins Auge gehen... Gruß Hawkeye |
Re: Cardinal in Bytes speichern
Zitat:
Zitat:
MfG xZise |
Re: Cardinal in Bytes speichern
Zitat:
Delphi-Quellcode:
Oder eben umgekehrt. In den Cardinal schreiben und die Bytes auslesen. Die 6 Bytes und der 1. Word + der Cardinal belegen den gleichen Speicher:
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;
Code:
-----------------------------------------------------
| Byte1 | Byte2 | Byte3 | Byte4 | | Byte5 | | Byte6 | ------------------------------------------------------ | dummy1 | W e r t | ------------------------------------------------------ |
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])^; |
Re: Cardinal in Bytes speichern
Zitat:
MfG xZise |
Re: Cardinal in Bytes speichern
Zitat:
|
Re: Cardinal in Bytes speichern
Moin moin,
wie gesagt, dass war nur eine weitere Möglichkeit. Ich persönlich würde die Variante von ![]() auch bevorzugen. |
Re: Cardinal in Bytes speichern
Habs grad mal getestet, scheint noch zu funktionieren, entschuldigt die unnötige Verwirrung :stupid:
Delphi-Quellcode:
TA: 8 Bytes
TA = record
AByte: Byte; BInt: Integer; end; TB = packed record AByte: Byte; BInt: Integer; end; TB: 5 Bytes |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 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