将uint8_t的矢量转换为bitset

时间:2016-12-26 06:33:31

标签: c++ c++11 vector bitset c++-standard-library

在下面的代码中,我从一些二进制文件中填充了uint8_t向量,其中包含some_size个字节数的信息 -

std::ifstream db(path.c_str(), std::ios::binary);
std::vector <uint8_t> buffer(some_size, 0);
db.read(reinterpret_cast<char *>(&buffer.front()), some_size);
db.close();

现在我知道从某个索引说20,我需要将10中的37个字节填入bitset。 bitset看起来像std::bitset<37> booleans;,并且最初初始化为所有0。现在,如果初始索引是20,那么我需要填充booleans 37个布尔值,这些值以字节为单位,范围从buffer[20]buffer[56]

除了循环向量并在bitset中的每个位上手动设置1或0之外,还有其他方法可以将这些字节转换为此位集吗?

2 个答案:

答案 0 :(得分:3)

由于您不想编写手动编码循环,因此可以使用std::for_each

#include <bitset>
#include <cstdint>
#include <vector>
#include <algorithm>

int main()
{
    std::vector <uint8_t> buffer(100, 0);
    std::bitset<37> b;
    std::size_t i = 0;
    std::for_each(buffer.begin() + 20, buffer.begin() + 57, [&](uint8_t val)
    { b[i] = val; ++i; });
}

根本问题是std::bitset没有迭代器,因此熟悉的STL算法函数,例如std::copystd::copy_nstd::transform等需要迭代器的函数如果std::bitset是算法函数中的源(或目标),则很难使用(如果不是不可能)。因此,似乎带有增加索引的lambda的std::for_each将起作用。

答案 1 :(得分:1)

您可以这样做:

std::vector<uint8_t> sourceVec{1,0,1,1,0};
std::stringstream strStream;
std::copy(sourceVec.begin(), sourceVec.end(), std::ostream_iterator<int>(strStream));
std::bitset<5> bitsetVar(strStream.str());