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 State

    Wie 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.


Anmelden zum Antworten