mekakic
2009-06-30, 15:07:21
Hi,
ich gucke mich gerade um, wie man Nachrichtenpakete komfortabel in C zusammenpacken und organisieren kann und bin über etwas gestolpert, was ich nicht kannte.
Normalerweise kann man logisch und hierarchisch Nachrichten ja sehr gut modellieren, in dem man sich ein Struct nimmt und da alles so organisiert, wie man es haben möchte. Das funktioniert aber normalerweise nicht als Nachrichtenformat, da man nicht sicher weiß, was der Compiler auf der einen Seite dem Typ für ein Datenalignment gegeben hat und ich kenne bisher keinen Weg einer bestimmten Struktur sicher ein Datenaligment auf 1-Byte Größen zu geben (wenn da jemand was kennt...).
Wenn ich allerdings sowas mache:
union byte_u
{
struct bits_s
{
uint8_t b0 : 1;
uint8_t b1 : 1;
uint8_t b2 : 1;
uint8_t b3 : 1;
uint8_t b4 : 1;
uint8_t b5 : 1;
uint8_t b6 : 1;
uint8_t b7 : 1;
} bitmask;
uint8_t byte;
};
Diese Schreibweise mit dem Doppelpunkt und der Angabe wieviel Bit ein Feld belegt habe ich zum ersten Mal gesehen. Habe ich das so zu verstehen, daß mit der ersten Variable der Speicherplatz in einem Struct bestimmt wird und man kann weitere Anhängen, die dann allmählich diese 8Bit füllen? Also wenn ich b7 weglasse braucht das Struct immernoch 1Byte Speicher (jetzt unabhängig von der union)? Und über 8Bit hinaus werden dann eben die nächsten uint8, uint16, uint32, uint64 verwendet, je nachdem welchen Typ das nächste Bitfeld im Struct hat?
Funktioniert das überall, auch über Compilergrenzen, CPUs etc. in C89/C90? In so einem Struct wo die Bitfelder über mehrere Grenzen hinausgehen liegt dann ja wohl kein Alignment an, oder? Kann Ich das auch für beliebige Typen verwenden? Ich gebe einem Struct im Struct einfach eine Größe an und die braucht es fortan? Oder müssen die folgenden immer vom gleichen Typ sein?
:confused:
ich gucke mich gerade um, wie man Nachrichtenpakete komfortabel in C zusammenpacken und organisieren kann und bin über etwas gestolpert, was ich nicht kannte.
Normalerweise kann man logisch und hierarchisch Nachrichten ja sehr gut modellieren, in dem man sich ein Struct nimmt und da alles so organisiert, wie man es haben möchte. Das funktioniert aber normalerweise nicht als Nachrichtenformat, da man nicht sicher weiß, was der Compiler auf der einen Seite dem Typ für ein Datenalignment gegeben hat und ich kenne bisher keinen Weg einer bestimmten Struktur sicher ein Datenaligment auf 1-Byte Größen zu geben (wenn da jemand was kennt...).
Wenn ich allerdings sowas mache:
union byte_u
{
struct bits_s
{
uint8_t b0 : 1;
uint8_t b1 : 1;
uint8_t b2 : 1;
uint8_t b3 : 1;
uint8_t b4 : 1;
uint8_t b5 : 1;
uint8_t b6 : 1;
uint8_t b7 : 1;
} bitmask;
uint8_t byte;
};
Diese Schreibweise mit dem Doppelpunkt und der Angabe wieviel Bit ein Feld belegt habe ich zum ersten Mal gesehen. Habe ich das so zu verstehen, daß mit der ersten Variable der Speicherplatz in einem Struct bestimmt wird und man kann weitere Anhängen, die dann allmählich diese 8Bit füllen? Also wenn ich b7 weglasse braucht das Struct immernoch 1Byte Speicher (jetzt unabhängig von der union)? Und über 8Bit hinaus werden dann eben die nächsten uint8, uint16, uint32, uint64 verwendet, je nachdem welchen Typ das nächste Bitfeld im Struct hat?
Funktioniert das überall, auch über Compilergrenzen, CPUs etc. in C89/C90? In so einem Struct wo die Bitfelder über mehrere Grenzen hinausgehen liegt dann ja wohl kein Alignment an, oder? Kann Ich das auch für beliebige Typen verwenden? Ich gebe einem Struct im Struct einfach eine Größe an und die braucht es fortan? Oder müssen die folgenden immer vom gleichen Typ sein?
:confused: