将 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,存在 1
或 0
的 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::copy
、std::copy_n
、std::transform
等,如果 std::bitset
是算法函数中的源(或目标),则 require 迭代器即使不是不可能也很难使用。因此,似乎 std::for_each
和一个增加索引的 lambda 会起作用。
在下面的代码中,我从一些二进制文件中填充了一个 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,存在 1
或 0
的 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::copy
、std::copy_n
、std::transform
等,如果 std::bitset
是算法函数中的源(或目标),则 require 迭代器即使不是不可能也很难使用。因此,似乎 std::for_each
和一个增加索引的 lambda 会起作用。