我想处理外部库提供的数据。
lib 保存数据并提供对它的访问,如下所示:
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;