在下面的代码中,我从一些二进制文件中填充了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,我需要将1
或0
中的37个字节填入bitset
。 bitset看起来像std::bitset<37> booleans;
,并且最初初始化为所有0
。现在,如果初始索引是20,那么我需要填充booleans
37个布尔值,这些值以字节为单位,范围从buffer[20]
到buffer[56]
。
除了循环向量并在bitset中的每个位上手动设置1或0之外,还有其他方法可以将这些字节转换为此位集吗?
答案 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::copy
,std::copy_n
,std::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());