在以下代码中,我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个字节任1
或0
我需要填写成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::copy
,std::copy_n
,std::transform
等,其需要迭代器是困难的,如果不是不可能的,如果要使用的std::bitset
是在算法功能的源(或目标)。因此,似乎std::for_each
随着lambda的增加,索引将起作用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句