将 uint8_t 的向量转换为位集

convert vector of uint8_t to bitset

在下面的代码中,我从一些二进制文件中填充了一个 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 中。位集看起来像 std::bitset<37> booleans; 并且最初初始化为所有 0。现在,如果初始索引为 20,那么我需要用 37 个布尔值填充 booleans,这些值以字节为单位,范围从 buffer[20]buffer[56]

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

你可以这样做:

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

既然你不想写一个手工编码的循环,你可以使用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 是算法函数中的源(或目标),则 require 迭代器即使不是不可能也很难使用。因此,似乎 std::for_each 和一个增加索引的 lambda 会起作用。