将uint8_t的向量转换为bitset

convert vector of uint8_t to bitset

本文关键字:转换 bitset 向量 uint8      更新时间:2023-10-16

在以下代码中,我有一个 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,存在37个字节的10,我需要填充到bitset中。该比特人看起来像std::bitset<37> booleans;,最初是将所有0 s初始化的。现在,如果初始索引为20,所以我需要用37个布尔值填充字节中的37个布尔值,该值的范围从 buffer[20]buffer[56]

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

由于您不想编写手工编码的循环,因此可以使用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_n,CC_14,std::transform等)都需要迭代器很难,如果std::bitset是源目标)在算法函数中。因此,似乎具有增加索引的lambda的std::for_each将起作用。

您可以做这样的事情:

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());