Bitverschiebung, Maskierung oder Bitfeldstruktur?

Ich bin neu in der Arbeit mit Bits. Ich versuche, mit einem vorhandenen Protokoll zu arbeiten, das drei verschiedene Arten von Nachrichten senden kann.

Typ 1 ist eine 16-Bit-Struktur:

struct digital 
{
 unsigned int type:2;
 unsigned int highlow:1;
 unsigned int sig1:5;
 unsigned int :1;
 unsigned int sig2:7;
};

Die ersten beiden Bits (Typ, in meiner Struktur oben) sind immer 1 0. Das dritte Bit, Highlow, bestimmt, ob das Signal ein- oder ausgeschaltet ist, und Sig1 + Sig2 definieren zusammen den 12-Bit-Index des Signals. Dieser Index wird durch eine 0 auf die beiden Bytes aufgeteilt, die sich immer in Bit 7 befindet.

Typ 2 ist eine 32-Bit-Struktur. Es hat einen 2-Bit-Typ, einen 10-Bit-Index und einen 16-Bit-Wert, durchsetzt mit Nullen an den Positionen 27, 23, 15 und 7. Eine Bitfeldstrukturdarstellung würde ungefähr so ​​aussehen:

struct analog 
{
 unsigned int type:2;
 unsigned int val1:2;
 unsigned int :1;
 unsigned int sig1:3;
 unsigned int :1;
 unsigned int sig2:7;
 unsigned int :1;
 unsigned int val2:7;
 unsigned int :1;
 unsigned int val3:7;
};

sig1 & sig2 bilden zusammen den 10-Bit-Index. val1 + val2 + val3 bilden zusammen den 16-Bit-Wert des Signals am 10-Bit-Index.

Wenn ich verstehe, wie man mit den ersten beiden Strukturen arbeitet, denke ich, dass ich die dritte herausfinden kann.

Meine Frage ist, gibt es eine Möglichkeit, einen einzelnen Wert zuzuweisen und das Programm die Bits zu ermitteln, die für val1, val2 und val3 erforderlich sind?

Ich habe etwas über Bitverschiebung, Bitfeldstrukturen und das Auffüllen mit Nullen gelesen. Die Struktur scheint der richtige Weg zu sein, aber ich bin nicht sicher, wie ich sie implementieren soll. Keines der Beispiele für Bit-Packing, die ich gesehen habe, hat Werte, die so aufgeteilt sind wie diese. Letztendlich möchte ich in der Lage sein, eine analoge Struktur zu erstellen, einen Index (i = 252) und einen Wert (v = 32768) zuzuweisen und damit fertig zu sein.

Wenn jemand die geeignete Methode vorschlagen oder einen Link zu einem ähnlichen Beispiel bereitstellen könnte, wäre ich Ihnen sehr dankbar. Wenn es darauf ankommt, wird dieser Code in eine größere Objective-C-App integriert.

Vielen Dank.

Brad

Antworten auf die Frage(3)

Ihre Antwort auf die Frage