Сдвиг битов, маскировка или структура битовых полей?
Я новичок в работе с битами. Я пытаюсь работать с существующим протоколом, который может отправлять три разных типа сообщений.
Тип 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.
Благодарю.
штифтик