Объединение двух байтов в один короткий [дубликат]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Объединение двух байтов в один короткий [дубликат]

Сообщение Anonymous »


Я получаю данные по последовательному проводу, поэтому полученные данные представляют собой массив байтов (uint8_t). но эти байты по сути представляют собой множество двухбайтовых слов (uint16_t). Мне интересно, как лучше всего безопасно преобразовать одну пару байтов или несколько пар в uint16_t. Полученные данные имеют формат [Word_1_LSB, Word_1_MSB, ..., Word_N_LSB, Word_N_MSB], чтобы учесть архитектуру с прямым порядком байтов, в которой должен выполняться мой код.

Чтобы избежать необработанных указателей, все буферы представляют собой std::arrays известного размера, а затем для передачи данных (не всегда требуется весь буфер) используется std::span. Можно ли каким-то образом перейти от std::span к std::span или есть проблемы с выравниванием. Это также было бы желательно для диапазонов с динамическим размером.

Другая идея заключалась в использовании reinterpret_cast, поскольку данные размещаются правильно с учетом порядка байтов.

Наконец, я подумал об использовании объединения для преобразования значений, но не знаю, как преобразовать несколько значений одновременно, возможно, с помощью массива объединения ниже.

union TwoBytes { uint8_t байт[2]; uint16_t комбинированный; }; Поскольку получатель данных не должен знать, что такое двухбайтовые слова, а что такое однобайтовые слова, преобразование должно происходить отдельно от получения данных.

Как лучше всего это сделать, используя C++20?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»