我想要做的是将数据存储在a std::vector<short>中std::vector<uint8_t>,将每个short分成两个uint8_t值.我需要这样做,因为我有一个只发送的网络应用程序std::vector<uint8_t>,所以我需要转换为uint8_t发送,然后在收到uint8_t向量时转换回来.
通常我会做什么(以及我在查找问题时看到的)是:
std::vector<uint8_t> newVec(oldvec.begin(),oldvec.end());
但是,如果我理解正确,这将取每个单独的短值,截断到uint8_t的大小,并创建一个新数据量和相同数量的条目的向量,当我想要的是相同数量的数据有两倍的条目.
包含一种扭转过程并尽可能避免复制的解决方案将会有很大帮助.谢谢!
要在8位边界处分割一些东西,你可以使用右移和掩码,即
uint16_t val;
uint8_t low = val & 0xFF;
uint8_t high = (val >> 8) & 0xFF;
Run Code Online (Sandbox Code Playgroud)
现在你可以把你的高点和低点放到你订单中的第二个向量中.
我需要这样做,因为我有一个网络应用程序1,它只会发送 std::vector
除了屏蔽和位移位之外,在通过网络发送内容时还应该考虑字节顺序。
数据的网络表示通常是大端字节序。所以你总是可以把 MSB 放在第一位。提供一个简单的函数,例如:
std::vector<uint8_t> networkSerialize(const std::vector<uint16_t>& input) {
std::vector<uint8_t> output;
output.reserve(input.size() * sizeof(uint16_t)); // Pre-allocate for sake of
// performance
for(auto snumber : input) {
output.push_back((snumber & 0xFF00) >> 8); // Extract the MSB
output.push_back((snumber & 0xFF)); // Extract the LSB
}
return output;
}
Run Code Online (Sandbox Code Playgroud)
并像这样使用它
std::vector<uint8_t> newVec = networkSerialize(oldvec);
Run Code Online (Sandbox Code Playgroud)
请参阅现场演示。
1)强调我的
| 归档时间: |
|
| 查看次数: |
1483 次 |
| 最近记录: |