将uint8_t的向量转换为位集

Abhinav高尼耶尔

在以下代码中,我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最初初始化为all 现在,如果初始索引为20,那么我需要填充booleans以字节为单位的37个布尔值,其范围从buffer[20]buffer[56]

除了遍历向量并在位集中的每个位上手动设置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_nstd::transform等,其需要迭代器是困难的,如果不是不可能的,如果要使用的std::bitset是在算法功能的源(或目标)。因此,似乎std::for_each随着lambda的增加,索引将起作用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章