Как склеить байты правильно?

Для склеивания байтов в C++ можно использовать побитовые операции и сдвиги. Есть несколько способов выполнить это действие, и я расскажу о двух наиболее популярных подходах: объединение данных и использование побитовых операторов.

1. Объединение данных:

Объединение данных - это механизм, предоставленный языком C++, который позволяет хранить различные типы данных в одной переменной. В этом случае мы можем объединить отдельные байты в одной структуре объединения и обратиться к ним целиком. Пример:

union ByteUnion {
  struct {
    uint8_t byte0;
    uint8_t byte1;
    uint8_t byte2;
    uint8_t byte3;
  };
  uint32_t combinedBytes;
};

int main() {
  ByteUnion bytes;
  bytes.byte0 = 0xAA;
  bytes.byte1 = 0xBB;
  bytes.byte2 = 0xCC;
  bytes.byte3 = 0xDD;

  std::cout << std::hex << bytes.combinedBytes << std::endl;  // Выведет: AABBCCDD
  return 0;
}

В этом примере объединение данных ByteUnion содержит четыре поля типа uint8_t, каждое из которых хранит один байт. Поле combinedBytes имеет тип uint32_t и может хранить 4 байта. После присваивания значений отдельным полям, можно получить склеенное значение, обратившись к полю combinedBytes.

2. Побитовые операторы:

Другой способ склеить байты - использовать побитовые операции и сдвиги. Мы можем выровнять байты с помощью битового сдвига влево (<<) и объединить их с помощью побитовой операции ИЛИ (|). Пример:

uint32_t combineBytes(uint8_t byte0, uint8_t byte1, uint8_t byte2, uint8_t byte3) {
  uint32_t combinedBytes = byte0;
  combinedBytes = (combinedBytes << 8) | byte1;
  combinedBytes = (combinedBytes << 8) | byte2;
  combinedBytes = (combinedBytes << 8) | byte3;
  return combinedBytes;
}

int main() {
  uint8_t byte0 = 0xAA;
  uint8_t byte1 = 0xBB;
  uint8_t byte2 = 0xCC;
  uint8_t byte3 = 0xDD;

  uint32_t combinedBytes = combineBytes(byte0, byte1, byte2, byte3);
  std::cout << std::hex << combinedBytes << std::endl;  // Выведет: AABBCCDD
  return 0;
}

В этом примере функция combineBytes принимает четыре отдельных байта и объединяет их в одно 32-битное значение. Мы начинаем со значения byte0 и выполняем битовый сдвиг влево на 8 битов, затем применяем побитовую операцию ИЛИ с byte1. Затем мы повторяем этот процесс для остальных байтов, выполняя битовые сдвиги и применяя операцию ИЛИ, что позволяет нам получить окончательное склеенное значение.

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