将字节数组转换为位集

新手上路,请多包涵

我有一个由随机数生成器生成的字节数组。我想把它放到 STL 位集中。

不幸的是,Bitset 似乎只支持以下构造函数:

  1. 一串 1 和 0,例如“10101011”
  2. 一个无符号长。 (我的字节数组会更长)

我现在能想到的唯一解决方案是逐位读取字节数组并制作一个由 1 和 0 组成的字符串。有没有人有更有效的解决方案?

原文由 Unknown 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 467
2 个回答

像这样的东西?

 #include <bitset>
#include <climits>

template<size_t numBytes>
std::bitset<numBytes * CHAR_BIT> bytesToBitset(uint8_t *data)
{
    std::bitset<numBytes * CHAR_BIT> b;

    for(int i = 0; i < numBytes; ++i)
    {
        uint8_t cur = data[i];
        int offset = i * CHAR_BIT;

        for(int bit = 0; bit < CHAR_BIT; ++bit)
        {
            b[offset] = cur & 1;
            ++offset;   // Move to next bit in b
            cur >>= 1;  // Move to next bit in array
        }
    }

    return b;
}

以及一个示例用法:

 int main()
{
    std::array<uint8_t, 4> bytes = { 0xDE, 0xAD, 0xBE, 0xEF };
    auto bits = bytesToBitset<bytes.size()>(bytes.data());
    std::cout << bits << std::endl;
}

原文由 strager 发布,翻译遵循 CC BY-SA 4.0 许可协议

bitset<> 有第三个构造函数——它不接受参数并将所有位设置为 0。我认为你需要使用它然后遍历数组调用 set() 为每个位在字节数组中为 1。

有点蛮力,但它会工作。将每个字节内的字节索引和位偏移量转换为位集索引会有一些复杂性,但没有什么想法(也许在调试器下运行)无法解决。我认为这很可能比尝试通过字符串转换或流运行数组更简单、更有效。

原文由 Michael Burr 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题