如何在std :: vector <uint8_t>中存储来自std :: vector <short>的数据

S. *_*sey 5 c++ vector

我想要做的是将数据存储在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的大小,并创建一个新数据量和相同数量的条目的向量,当我想要的是相同数量的数据有两倍的条目.

包含一种扭转过程并尽可能避免复制的解决方案将会有很大帮助.谢谢!

Ser*_*rge 6

要在8位边界处分割一些东西,你可以使用右移和掩码,即

uint16_t val;
uint8_t low = val & 0xFF;
uint8_t high = (val >> 8) & 0xFF;
Run Code Online (Sandbox Code Playgroud)

现在你可以把你的高点和低点放到你订单中的第二个向量中.


use*_*042 2

我需要这样做,因为我有一个网络应用程序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)强调我的