Я хочу обработать данные, предоставленные внешней библиотекой.
Библиотека хранит данные и предоставляет к ним доступ следующим образом:
const uint8_t* data;
std::pair<const uint8_t*, const uint8_t*> getvalue() const {
return std::make_pair(data + offset, data + length);
}
Я знаю, что текущие данные содержат два числа uint16_t
, но мне нужно изменить их порядок байтов. Таким образом, данные имеют длину 4 байта и содержат следующие числа:
66 4 0 0
Итак, я хотел бы получить два числа uint16_t
со значением 1090
и 0
соответственно.
Я могу выполнить базовую арифметику и в одном месте изменить порядок следования байтов:
pair<const uint8_t*, const uint8_t*> dataPtrs = library.value();
vector<uint8_t> data(dataPtrs.first, dataPtrs.second);
uint16_t first = data[1] <<8 + data[0]
uint16_t second = data[3]<<8 + data[2]
Однако я хотел бы сделать что-то более элегантное (вектор можно заменить, если есть лучший способ получить uint16_t
s).
Как мне лучше создать uint16_t
из uint8_t*
? Я бы по возможности избегал memcpy и использовал что-то более современное/безопасное.
В Boost есть хорошая библиотека с порядком байтов , который может работать, но для него требуется ввод uint16_t
.
Чтобы пойти дальше, Boost также предоставляет типы данных для изменения порядка следования байтов, поэтому я мог бы создать структуру:
struct datatype {
big_int16_buf_t data1;
big_int16_buf_t data2;
}
Можно ли безопасно (отступы, зависимость от платформы и т. д.) преобразовать действительное 4-байтовое число uint8_t*
в datatype
? Может быть, с чем-то вроде этого союза?
typedef union {
uint8_t u8[4];
datatype correct_data;
} mydata;
memcpy()
или из С++ 20std::bit_cast()
. - person underscore_d   schedule 11.06.2020std::bit_cast
из указателя (если только вы не используете значение указателя, а не заостренные объекты). - person eerorika   schedule 11.06.2020std::uint8_t*
, то вы получаетеstd::uint8_t
, размер которого не соответствует размеру бит_преобразования вstd::uint16_t
(или вdatatype
). Я не понимаю, как здесь можно использовать bit_cast. - person eerorika   schedule 11.06.2020