Начнем с того, что рассматриваемое приложение всегда будет работать на одном и том же процессоре, а компилятор всегда gcc, поэтому меня не волнует, что битовые поля не переносимы.
gcc размещает битовые поля так, чтобы первое перечисленное поле соответствовало младшему значащему биту байта. Таким образом, следующая структура с a = 0, b = 1, c = 1, d = 1, вы получите байт значения е0.
struct Bits {
unsigned int a:5;
unsigned int b:1;
unsigned int c:1;
unsigned int d:1;
} __attribute__((__packed__));
(На самом деле, это C ++, поэтому я говорю о g ++.)
Теперь, допустим, я хотел бы, чтобы a было шестизначным целым числом.
Теперь я понимаю, почему это не сработает, но я кодировал следующую структуру:
struct Bits2 {
unsigned int a:6;
unsigned int b:1;
unsigned int c:1;
unsigned int d:1;
} __attribute__((__packed__));
Установка b , c и d в 1 и a в 0 приводит к следующим двум байтам:
c0 01
Это не то, что я хотел. Я надеялся увидеть это:
e0 00
Есть ли способ указать структуру, которая имеет три бита в старших битах первого байта и шесть битов, охватывающих пять младших бит первого байта и старший бит второго?
Пожалуйста, имейте в виду, что я не могу контролировать, где эти биты должны быть размещены: это макет битов, которые определяются чьим-либо интерфейсом.