Скопируйте структуру внутри байтового буфера

У меня есть следующая структура:

struct sample {
uint8_t four;
bool    b;
uint8_t two;
};

Чтобы отправить пакет udp, мне нужно упаковать эти значения в один байт:

| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+---+---+---+---+---+---+---+---+
|     four      | 0 | b |  two  |
+---------------+---+---+-------+

Каков наилучший способ скопировать значения структуры в этом байте? Я проверяю предварительное условие перед тем, как делать это, поэтому при копировании не должно быть никаких данных uint8_t ценности в меньшее пространство.

0

Решение

Я бы просто использовал функцию:

uint8_t pack( const sample &s )
{
return ( s.four & 0xF ) | ( s.b << 5 ) | ( ( s.two & 3 ) << 6 );
}

как вы сказали, что диапазон данных проверен, вы можете упростить это до:

    return s.four | ( s.b << 5 ) | ( s.two << 6 );
5

Другие решения

Так как ваш код в любом случае не переносим, ​​вы можете просто использовать здесь битовые поля:

struct sample {
uint8_t four:4;
bool    empty:1;
bool    b:1;
uint8_t two:2;
};

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

2

Ваш битовый порядок отображается … уникальным способом. Обычно, когда мы выражаем значения в двоичном виде, младшие биты отображаются справа. Пока вы упаковываете и распаковываете данные, вы можете выбрать битовый порядок. Остерегайтесь сетевого заказа против системного заказа, хотя. Хотя порядок следования битов в байтах одинаков для каждой платформы, порядок слов в байтах может изменяться.

Вы должны знать свое заявление, чтобы определить, стоит ли упаковка / распаковка усилий. Больше вычислений на каждой стороне и в зависимости от интервалов между пакетами UDP и от того, сколько данных упаковано в каждый пакет UDP, это может не стоить. Если вы просто пытаетесь сохранить данные для мобильного приложения, спасибо: @)

Я всегда избегаю смещения логических значений из-за паранойи платформы / компилятора. Может вместо этого использовать что-то вроде s.b? 32: 0.

0