我如何将位集转换为字节数组/ uint8?

问题描述 投票:8回答:3

我需要从可能(不)包含多个CHAR_BIT位的位集中提取字节。现在,我需要将位集中的多少位放入数组中。例如,

设置的位声明为std::bitset < 40> id;

有一个单独的变量nBitsid中的多少位可用。现在,我想以CHAR_BIT的倍数提取这些位。我还需要注意nBits % CHAR_BIT != 0的情况。我可以将其放入uint8数组中

c++ arrays bitset
3个回答
3
投票

[不幸的是,假设您只需要unsigned long中的位数(在这种情况下,您可以使用to_ulong),那么语言中就没有好的方法。您必须迭代所有位并自己生成字节数组。


17
投票

您可以使用boost::dynamic_bitset,可以使用boost::to_block_range将其转换为一定范围的“块”。

#include <cstdlib>
#include <cstdint>
#include <iterator>
#include <vector>
#include <boost/dynamic_bitset.hpp>

int main()
{
    typedef uint8_t Block; // Make the block size one byte
    typedef boost::dynamic_bitset<Block> Bitset;

    Bitset bitset(40); // 40 bits

    // Assign random bits
    for (int i=0; i<40; ++i)
    {
        bitset[i] = std::rand() % 2;
    }

    // Copy bytes to buffer
    std::vector<Block> bytes;
    boost::to_block_range(bitset, std::back_inserter(bytes));
}

0
投票

使用标准C ++ 11,您可以通过移位和屏蔽从40位bitset中提取字节。当第二个数字不是第一个数字的倍数时,我没有处理不同的值,而不是8和40。

#include <bitset>
#include <iostream>
#include <cstdint>

int main() {
    constexpr int numBits = 40;

    std::bitset<numBits> foo(0x1234567890);
    std::bitset<numBits> mask(0xff);

    for (int i = 0; i < numBits / 8; ++i) {
        auto byte =
            static_cast<uint8_t>(((foo >> (8 * i)) & mask).to_ulong());
        std::cout << std::hex << static_cast<int>(byte) << std::endl;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.