将uint8_t的向量转换为bitset
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,存在37个字节的1
或0
,我需要填充到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::copy
,std::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());
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 如何以滑动窗口方式从 std::bitset 读取位并将它们转换为 int?
- 将字符数组转换为 std::string 以传递到 std::bitset seg 错误
- 从文件中读取字符串并转换为 bitset<12>
- 将uint8_t的向量转换为bitset
- 将BITSet转换为ASCII字符串
- 如何使用库将二进制转换为十进制<bitset>?
- 是否可以将 Bitset<8> 的值复制到数组字符串而不转换它们?
- 避免对bitset模板进行窄化转换
- 我如何将bitset转换为字节/uint8数组
- 如何在不指定位大小的情况下将字符串转换为bitset ?
- Std::string转换为Std::bitset,由Std::string表示,反之亦然