У меня есть следующая структура:
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
ценности в меньшее пространство.
Я бы просто использовал функцию:
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 );
Так как ваш код в любом случае не переносим, вы можете просто использовать здесь битовые поля:
struct sample {
uint8_t four:4;
bool empty:1;
bool b:1;
uint8_t two:2;
};
Я не фанат битовых полей, но они, кажется, применимы в вашем случае.
Ваш битовый порядок отображается … уникальным способом. Обычно, когда мы выражаем значения в двоичном виде, младшие биты отображаются справа. Пока вы упаковываете и распаковываете данные, вы можете выбрать битовый порядок. Остерегайтесь сетевого заказа против системного заказа, хотя. Хотя порядок следования битов в байтах одинаков для каждой платформы, порядок слов в байтах может изменяться.
Вы должны знать свое заявление, чтобы определить, стоит ли упаковка / распаковка усилий. Больше вычислений на каждой стороне и в зависимости от интервалов между пакетами UDP и от того, сколько данных упаковано в каждый пакет UDP, это может не стоить. Если вы просто пытаетесь сохранить данные для мобильного приложения, спасибо: @)
Я всегда избегаю смещения логических значений из-за паранойи платформы / компилятора. Может вместо этого использовать что-то вроде s.b? 32: 0.