Сдвиг битов, маскировка или структура битовых полей?

Я новичок в работе с битами. Я пытаюсь работать с существующим протоколом, который может отправлять три разных типа сообщений.

Тип 1 представляет собой 16-битную структуру:

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

Первые два бита (типа, в моей структуре выше) всегда 1 0. Третий бит, highlow, определяет, включен или выключен сигнал, а sig1 + sig2 вместе определяют 12-битный индекс сигнала. Этот индекс разделен между двумя байтами на 0, который всегда находится в бите 7.

Тип 2 - это 32-битная структура. Он имеет 2-битный тип, 10-битный индекс и 16-битное значение, чередующиеся с нулями в позициях 27, 23, 15 и 7. Представление структуры битового поля должно выглядеть примерно так:

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 вместе образуют 10-битный индекс. val1 + val2 + val3 вместе образуют 16-битное значение сигнала с 10-битным индексом.

Если я понимаю, как работать с первыми двумя структурами, я думаю, что смогу понять третью.

У меня вопрос, есть ли способ присвоить единственное значение и заставить программу обрабатывать биты, которые должны входить в val1, val2 и val3?

Я читал о сдвиге битов, структурах битового поля и заполнении нулями. Структура выглядит как путь, но я не уверен, как это реализовать. Ни один из примеров упаковывания битов, которые я видел, не имеет значений, которые разделяются так, как они есть. В конечном счете, я хотел бы иметь возможность создать аналоговую структуру, назначить индекс (i = 252) и значение (v = 32768) и покончить с этим.

Если кто-то может предложить подходящий метод или дать ссылку на подобный образец, я был бы очень признателен. Если это имеет значение, этот код будет включен в более крупное приложение Objective-C.

Благодарю.

штифтик

Ответы на вопрос(3)

Ваш ответ на вопрос