Сдвиг битов, маскировка или структура битовых полей?
Я новичок в работе с битами. Я'Я пытаюсь работать с существующим протоколом, который может отправлять три разных типа сообщений.
Тип 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-битное значение, с добавлением 0 's в позициях 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 '
читал о сдвиге битов, структурах битового поля и заполнении 0 's. Структура, кажется, путь, но яЯ не уверен, как это реализовать. Ни один из примеров упаковки битов, которые яМы видели, что есть значения, которые делятся так, как они есть. В конечном счете, яЯ хотел бы иметь возможность создать аналоговую структуру, назначить индекс (i = 252) и значение (v = 32768) и покончить с этим.
Если кто-то может предложить соответствующий метод или предоставить ссылку на подобный образец, яЯ очень ценю это. Если это имеет значение, этот код будет включен в более крупное приложение Objective-C.
Благодарю.
Бради»