Объединение двух байтов в один короткий [дубликат] ⇐ C++
-
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?
Я получаю данные по последовательному проводу, поэтому полученные данные представляют собой массив байтов (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?
Мобильная версия