Byte data
-
Hallo,
Ich habe eine Frage bzgl. einer struct definition.
Ich habe ein 3 byte data, folgendermasen segmentiert:typedef struct { char ID; // 1 BIT (0) char Mode; //3 BIt (1-3) char State; // 4 BIT (4-7) char time; //16 BIT (8-23) } status_messages;
Frage 1:
Ist char die korrekte Art einen bit wert zu definieren? Wie definiert man einen 3 oder 4 bit Wert?
Frage 2:
Zum Versendeen der Daten benötige ich den HEx Wert des ersten
byte (Bit 0 to 7), des zweiten (8-15) und dritten (16-23) byte.
Wie könnte man diese Hex Werte elegent erhalten?Vielen Dank !
-
Jedes deiner Strukturelemente entspricht einem Byte.
Was du brauchst, ist ein bitfield.
Das machst du in etwa so.typedef struct { unsigned long ID : 1; // 1 BIT (0) unsigned long Mode : 2; //3 BIt (1-3) unsigned long State : 3; // 4 BIT (4-7) unsigned long time : 15 ; //16 BIT (8-23) } status_messages;
nun kannst du die Elemente mit Namen ansprechen, wie
eine nomale struct.
Du konntest sie glaub ich auch mit einer Union kombinieren, so
dass du das Status-DWord auch als ganzes setzen kannst.
-
Also SeppSchrot's Bitgrössen kann ich nicht so richtig nachvollziehen. Hier mal eine korrekte Version:
typedef struct { unsigned int ID : 1; // 1 BIT (0) unsigned int Mode : 3; // 3 BIt (1-3) unsigned int State : 4; // 4 BIT (4-7) unsigned int time : 16; // 16 BIT (8-23) } status_messages;
-
Erstmal danke für die schnellen Antworten.
Dieses struct Datentyp ist sehr praktisch, später benötige ich aber in etwa folgendes:
Data[0] = 8 Bits = x x x x x x x x
ID Mode StateWie kann man aus diesen 3 Werten später wieder ein int : 8 mit dieser Struktur bauen?
-
Grundsätzlich hast du zwei Möglichkeiten, casten oder, wie Sepp schon andeutete, Unions zu benutzen.
// Fall 1: Casten status_messages sm; sm.ID = 1; // ... unsigned char Data[10]; Data[0] = *(unsigned char*) &sm; // Fall 2: Unions typedef union { struct { unsigned int ID : 1; // 1 BIT (0) unsigned int Mode : 3; // 3 BIt (1-3) unsigned int State : 4; // 4 BIT (4-7) unsigned int time : 16; // 16 BIT (8-23) } detail; unsigned char raw[3]; } status_messages; status_messages sm; sm.detail.ID = 1; // ... unsigned char Data[10]; Data[0] = sm.raw[0];
-
OK, jetzt habe ich es kapiert. Sehr elegante Lösung.
Ein letztes Problem habe ich noch:
Falls ich einen dezimal Wert in einem unsigned int : 16 Werte schreibe, kann ich irgendwie beinflussen, wo LSB und MSB liegen ?
Bei dem union Besipiel möchte ich z.B. sicherstellen, daß Byte 2 mit dem LSB Wert des Time Wertes beginnt.
-
Also SeppSchrot's Bitgrössen kann ich nicht so richtig nachvollziehen.
Hehe, jetzt nach dem Frühstück kann ich sie auch nicht mehr nachvollziehen
@pelom:
Fast jedes OS stellt eine Funktion Namens htons (HostToNetwork-Short) zur Verfügung.
Vielleicht ist das was für dich. (Vielleicht wars aber genau umgekehrt.)
-
pelom schrieb:
Falls ich einen dezimal Wert in einem unsigned int : 16 Werte schreibe, kann ich irgendwie beinflussen, wo LSB und MSB liegen?
das geht in c/c++ leider nicht. du mußt dir da mit char timer_hi,timer_lo; behelfen
-
das geht in c/c++ leider nicht
Na also in C++ könnte man sich da schon ein kleines Klässle bauen, für das man die benötigten Operatoren beidseitig überläd.